gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 11:38:24 25 4
gpt4 key购买 nike

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com