-3

I had gone through multiple stack overflow posts and tried to implement following example that uses dlopen with c++ objects class I have following code.

1) File hello.cc

#include <stdio.h>
#include "hello.h"
A::A() {
    init1();
} 
void A::init1() {
    printf("\n init ");
} 

2) File hello.h

#include <iostream>
class A {
    public: 
         A();
         void init1();
         inline void fun () { cout << "\n Inside fun"; }
 };


 extern "C" A* createA() {
   return new A;
 }

}

3) File main.cpp

#include<iostream>
#include<dlfcn.h>
#include "hello.h" 
using namespace std;
int main() {
    void *handle;
    handle = dlopen("./libhello.so", RTLD_LAZY | RTLD_GLOBAL);
    if (!handle) {
      cout << "The error is " << dlerror();
    }
    return 0 ;
 }

I am using following steps to create the shared library

1) g++ -g -fPIC -c hello.cc
2) g++ -g -shared -o libhello.so hello.o
3) g++ -g -o myprog main.cpp -

main.cpp:(.text+0x18): undefined reference to `A::A()' . The function createA in hello.h is declared so the same can be used to dlsym
  1. I am unable to use createA in dlsym
  2. I am getting undefined reference to `A::A() even If I do not use dlsym
  3. My query is what is correct was to use C++ class objects in dlsym
  4. From man of dlopen I am not able to infer what is significance of RTLD_LAZY RTLD_GLOBAL RTLD_NOW flags
Anton Menshov
  • 2,266
  • 14
  • 34
  • 55
TechEnthusiast
  • 273
  • 4
  • 18

2 Answers2

0

Just put in the command line:

g++ -g -o myprog main.cpp -l hello -l dl  -L ./

and of course - when you want to run it locally, need to compile with -rpath

.. -Wl,-rpath ./
gyula
  • 1
  • 1
0

Corrected hello.h:

/* hello.h */

#include <cstdio>

class A {
    public: 
         A();
         void init1();
         inline void fun () { printf ("A::fun (this=%p)\n", this); }
 };

extern "C" A* createA();

hello.cc:

/* hello.cc */

#include <cstdio>

#include "hello.h"

A::A() {
    init1();
}

void A::init1() {
    printf("A::init1 this=%p\n", this);
}

extern "C" A* createA() {
    return new A;
} 

main.cc:

/* main.cc */

#include <cstdio>
#include <iostream>
#include <dlfcn.h>
#include "hello.h"

using namespace std;

typedef A *fun_createA();

int main() {
    void *handle;
    fun_createA *ptr_createA;
    A *myA;

    handle = dlopen("./libhello.so", RTLD_LAZY | RTLD_GLOBAL);
    if (!handle) {
      cout << "The error is " << dlerror();
    }
    ptr_createA = (fun_createA *)dlsym (handle, "createA");
    printf ("ptr_createA is %p\n", ptr_createA);

    myA = ptr_createA ();
    printf ("ptr_createA gave me %p\n", myA);

    myA->fun ();

    return 0;
}
Lorinczy Zsigmond
  • 1,749
  • 1
  • 14
  • 21