问题描述
我不是 Linux 的常客,我认为我做错了什么。
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 (将#修改为@)