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

标签 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++,真正的问题是构造函数/成员函数中 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/

相关文章:

c - 为什么在 OSX 上的 C 编程中 Ctrl-J 和 Ctrl-M 返回 10?

Java:如何知道 jar 位于 Linux 中的位置

Linux 庆典错误 : -bash: No such file or directory

java - 无法正确地将 std::pair 暴露给 java 绑定(bind)?

c++ - 使用 boost::accumulators,如何重置滚动窗口大小,它是否保留额外的历史记录?

c - 如何检查 C 中指定小数位的准确性

c - 获取数字的最后一位数

c++ - 对象 "is not a structure or union"如果临时传递给构造函数

c++ - 如何在 C 或 C++ 中进行相等比较?

我们可以对未命名的管道使用 poll 函数吗?