我经历了多个堆栈溢出帖子并尝试实现以下使用dlopen和c ++对象类的示例 我有以下代码。
1)文件hello.cc
#include <stdio.h>
#include "hello.h"
A::A() {
init1();
}
void A::init1() {
printf("\n init ");
}
2)文件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)文件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 ;
}
我正在使用以下步骤来创建共享库
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
答案 0 :(得分:0)
只需输入命令行:
g++ -g -o myprog main.cpp -l hello -l dl -L ./
当然 - 当你想在本地运行它时,需要使用-rpath
进行编译.. -Wl,-rpath ./
答案 1 :(得分:0)
更正了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;
}