我有一个使用 dlopen
加载库的应用程序,它看起来像这样:
#include <iostream>
#include <dlfcn.h>
void foo()
{
std::cout << "foo";
}
int main()
{
void* libbar = dlopen("./libbar.so", RTLD_LAZY);
if (!libbar)
{
std::cerr << dlerror() << std::endl;
return 1;
}
void(*bar)() = (void(*)())dlsym(libbar, "bar");
if (!bar)
{
std::cerr << dlerror() << std::endl;
return 1;
}
bar();
dlclose(libbar);
}
这是libbar
:
#include <iostream>
void foo();
extern "C"
void bar()
{
foo();
std::cout << "bar" << std::endl;
}
输出:
./libbar.so: undefined symbol: _Z3foov
预期输出:
foobar
如何使foo
对libbar
可见?
我实际上使用的是 C++,真正的问题是构造函数/成员函数中 undefined symbol ,但这应该非常相似。我正在使用 GCC 4.7 处理 Linux。
最佳答案
您应该编译并链接 main.cc
g++ -rdynamic -Wall main.cc -o prog -ldl
-rdynamic标志在链接时很重要。
并且您最好声明 extern "C"
那些要传递给 dlsym
的函数。
另请参阅Program Library HowTo .
关于c++ - 如何使应用程序符号对库可见?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16399309/