首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在只读部分“.text”中针对xxx的重新定位-在SUSE中错误的编译器或linux设置?

问在只读部分“.text”中针对xxx的重新定位-在SUSE中错误的编译器或linux设置?
EN

Stack Overflow用户
提问于 2020-12-22 11:08:21
回答 4查看 19.1K关注 0票数 13

我不是Linux的经常用户,我想我做错了什么。

这是我正在生成的测试动态库".so“的代码。

代码语言:javascript
复制
class InternalClass
{
public:
    int Function(){ return 10; }
};

extern "C"
{
    int WrapperFunctionSimple() { return 10; }
    void WrapperCreateInstance() {InternalClass* item = new InternalClass(); delete item; }
}

编译失败,出现以下错误:

代码语言:javascript
复制
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,它会编译。但是在使用这个库时,当我添加最后一个函数时,不能加载它:

代码语言:javascript
复制
void WrapperCreateInstance() {InternalClass* item = new InternalClass(); delete item; }

问题是使用InternalClass,没有这个函数,一切都能工作。

我在用VirtualBox。我安装了OpenSUSE 64位,使用这个库的应用程序也是64位。在另一个linux发行版(Mint)中,使用完全相同的项目和设置(没有fPIC),可以编译它。当我使用那个库(.so)时,它在SUSE中工作。

我还用:

  • gcc (SUSE ) 7.5.0
  • g++ (SUSE ) 7.5.0
  • My IDE::块20 (最后版本)。除-m64标志外,设置为空。

。

我做错了什么?这似乎是高级Linux用户可以帮助我理解的东西。

编辑:要添加更多信息,可以使用相同的设置在Ubuntu中编译。不是在苏赛

EN

回答 4

Stack Overflow用户

发布于 2021-12-27 17:04:35

对我来说,如果一个库( A )依赖于另一个( B ),而库A在库B之前被链接,则解决方案是先链接库B,然后连接A。

票数 5
EN

Stack Overflow用户

发布于 2021-12-20 09:13:46

当我用GCC来编译一个CPP文件时,我就遇到了这种情况。因此,对于C++文件,只使用g++,显然不使用GCC,这意味着c文件。

票数 4
EN

Stack Overflow用户

发布于 2022-09-07 12:26:44

我正在使用cmake和GCC在ubuntu,我得到了同样的错误。

在我的例子中,我添加了XX.h文件以包含目录,并在我的main.cpp中使用了一个在XX.h头文件中定义的“”。但是,我忘了将XX.c添加到可执行源中。

当我将XX.c添加到Cmake的add_executable()中的目标可执行源时,将清除此错误。

我希望我能清楚地陈述我的情况。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65407610

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档