gpt4 book ai didi

c++ - .so 文件没有正确的依赖关系为什么它工作

转载 作者:行者123 更新时间:2023-11-30 00:44:34 28 4
gpt4 key购买 nike

我无意中遇到了这个问题。

// foo.cpp
#include <iostream>

int i;

extern "C" {
void pn() {
std::cout << "Hello!" << std::endl;
}
}

我使用 gcc 将 foo.cpp 编译成 foo.so:

gcc -fPIC --shared foo.cpp -o libfoo.so

然后是bar.cpp

// bar.cpp
#include <dlfcn.h>
#include <stdio.h>
#include <iostream>

using namespace std;

extern "C" {
int decode();
}

int decode() {
void *handle = dlopen("libfoo.so", RTLD_LAZY);
if (!handle) {
printf("%s \n", dlerror());
return 1;
}
void (*pn)() = (void (*)()) dlsym(handle, "pn");
(*pn)();
return 0;
}

bar.cpp 使用 g++ 编译成 libbar.so

g++ -fPIC --shared -L. -Wl,-R. bar.cpp -lfoo -ldl -o libbar.so

decodemain.cpp 中调用。

// main.cpp
#include <dlfcn.h>
#include <stdio.h>

// Magic sauce
//#include <iostream>
//using namespace std;

int main() {
void *handle = dlopen("libbar.so", RTLD_LAZY);
if (!handle) {
printf("%s \n", dlerror());
return 1;
}
int (*pn)() = (int (*)()) dlsym(handle, "decode");
(*pn)();
return 0;
}

main.cpp 被编译成可执行文件 main

 g++ -L. -Wl,-R. main.cpp -lbar -ldl -lstdc++ -o main

我使用 ldd 检查 libfoo 的依赖关系。

linux-vdso.so.1 =>  (0x00007ffd5b75e000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f2d9677a000)
/lib64/ld-linux-x86-64.so.2 (0x0000563d0c838000)

如果我在 main.cpp 中使用 iostream,这会导致 main 依赖于 libstdc++.so。然后这个 main 运行没有任何问题。但是,如果 main 不包含该 c++ 用法,则可执行文件会中断。

./libfoo.so: undefined symbol: _ZSt4endlIcSt11char_traitsIcEERSt13basic_ostreamIT_T0_ES6_

我已经挣扎了三天了。伤口感谢任何帮助。

我知道使用g++ 编译foo.cpp 是正确的选择。我只是想了解这里发生了什么。

最佳答案

当你不使用 iostream 时失败因为你的编译器看到的主文件不依赖于 libstdc++ ,但是 foo.cpp/foo.so确实取决于 libstdc++ .

您可能想知道为什么只有 #include <iostream>解决问题。那是因为iostream实际上只是通过被包括进来做一些工作。例如它设置std::cout .因此,虽然您可能认为程序代码没有改变,但它实际上已经改变了——#include 添加了静态初始化。这取决于 libstdc++ .

此类问题(编译器看不到的间接依赖项)的一般解决方案在此处:Force to link against unused shared library

关于c++ - .so 文件没有正确的依赖关系为什么它工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48320561/

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