我不是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。我安装了OpenSUSE 64位,使用这个库的应用程序也是64位。在另一个linux发行版(Mint)中,使用完全相同的项目和设置(没有fPIC),可以编译它。当我使用那个库(.so)时,它在SUSE中工作。
我还用:
。
我做错了什么?这似乎是高级Linux用户可以帮助我理解的东西。
编辑:要添加更多信息,可以使用相同的设置在Ubuntu中编译。不是在苏赛
发布于 2021-12-27 17:04:35
对我来说,如果一个库( A )依赖于另一个( B ),而库A在库B之前被链接,则解决方案是先链接库B,然后连接A。
发布于 2021-12-20 09:13:46
当我用GCC来编译一个CPP文件时,我就遇到了这种情况。因此,对于C++文件,只使用g++,显然不使用GCC,这意味着c文件。
发布于 2022-09-07 12:26:44
我正在使用cmake和GCC在ubuntu,我得到了同样的错误。
在我的例子中,我添加了XX.h文件以包含目录,并在我的main.cpp中使用了一个在XX.h头文件中定义的“”。但是,我忘了将XX.c添加到可执行源中。
当我将XX.c添加到Cmake的add_executable()中的目标可执行源时,将清除此错误。
我希望我能清楚地陈述我的情况。
https://stackoverflow.com/questions/65407610
复制相似问题