如何解决在只读部分“.text”中重定位 xxx - SUSE 中的编译器或 linux 设置错误?
我不是 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 64bit,使用该库的应用程序也是 64bit。在另一个 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 中
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。