如何使应用程序符号对库可见?

时间:2013-05-06 12:59:31

标签: c++ c linux gcc visibility

我有一个使用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

如何使foolibbar可见?

我实际上正在使用C ++,真正的问题是来自构造函数/成员函数的未定义符号,但这应该非常相似。我正在使用GCC 4.7开发Linux。

1 个答案:

答案 0 :(得分:5)

您应该使用

编译和链接main.cc
 g++ -rdynamic -Wall main.cc -o prog -ldl

-rdynamic标志在链接时很重要。

您最好将extern "C"声明要传递给dlsym的函数。

另请参阅Program Library HowTo