我不是 Linux 的常客,我认为我做错了什么。
这是我正在生成的测试动态库“.so”的代码。
class InternalClass
{
public:
int Function(){ return 10; }
};
extern "C"
{
int WrapperFunctionSimple() { return 10; }
void WrapperCreateInstance() {InternalClass* item = new InternalClass(); delete item; }
}
编译失败并出现以下错误:
g++ -Wall -fexceptions -O2 -c /home/lidia/compartida/TestLibrary/TestLibrary/main.cpp -o obj/Release/main.o
g++ -shared obj/Release/main.o -o bin/Release/libTestLibrary.so -s
/usr/lib64/gcc/x86_64-suse-linux/7/../../../../x86_64-suse-linux/bin/ld: obj/Release/main.o: warning: relocation against `_Znwm@@GLIBCXX_3.4' in read-only section `.text'
/usr/lib64/gcc/x86_64-suse-linux/7/../../../../x86_64-suse-linux/bin/ld: obj/Release/main.o: relocation R_X86_64_PC32 against symbol `_Znwm@@GLIBCXX_3.4' can not be used when making a shared object; recompile with -fPIC
/usr/lib64/gcc/x86_64-suse-linux/7/../../../../x86_64-suse-linux/bin/ld: final link failed: bad value
collect2: error: ld returned 1 exit status
我按照建议尝试使用 -fPIC 并编译。但是当使用这个库时,当我添加最后一个函数时它无法加载:
void WrapperCreateInstance() {InternalClass* item = new InternalClass(); delete item; }
问题是使用 InternalClass,没有这个功能一切正常。
我正在使用 VirtualBox。我安装的是 64 位的 OpenSUSE,使用该库的应用程序也是 64 位的。在另一个 linux 发行版 (Mint) 中,具有完全相同的项目和设置(没有 fPIC),它可以被编译。当我使用该库 (.so) 时,它可以在 SUSE 中使用。
我也在使用:
- gcc (SUSE Linux) 7.5.0
- g++ (SUSE Linux) 7.5.0
- 我的 IDE 是 Code::Blocks 20(最新版本)。除 -m64 标志外,设置为空。
我究竟做错了什么?这似乎是高级 Linux 用户可以帮助我理解的东西。
编辑:要添加更多信息,这可以在 Ubuntu 中使用相同的设置进行编译。不在 SUSE 中
原文由 Darkgaze 发布,翻译遵循 CC BY-SA 4.0 许可协议
对我来说,如果一个库 (A) 依赖于另一个库 (B),并且库 A 在库 B 之前链接。解决方案是先链接库 B,然后再链接 A。