对`.rodata'重新定位R_X86_64_32S ...在64位平台上进行编译

Mar*_*are 25 c++ g++ 32bit-64bit

所以我一直在32位编码,昨天我需要构建一个DLL,我有几个问题.无论如何我在这里解决了他们.

不幸的是,即使我认为一切工作毕竟我发现,情况并非如此,当我提出我的程序和其他计算机上生成文件是什么在64位上运行,你可以猜到发生了什么事?

所以我的问题与64位的重定位有关

/usr/bin/ld: MyClass.o: relocation R_X86_64_32S against `.rodata' can not be used when making a shared object; recompile with -fPIC
MyClass.o: could not read symbols: Bad value
Run Code Online (Sandbox Code Playgroud)

这是我的makefile

MyProgram: main.o chkopts
    -${CLINKER} -o $@ $< ${MYLIB} ${PETSC_MAT_LIB}
    ${RM} main.o

    export LD_LIBRARY_PATH=${LIBADD}:$LD_LIBRARY_PATH

LibMyProgram.so: MyClass.o  chkopts
    -${CLINKER}  -shared -Wl,-soname,${SONAME} -o ${VERS}   *.o  ${PETSC_MAT_LIB}

    mv ${VERS} ${LIBADD}
    ln -sf ${LIBADD}${VERS} ${LIBADD}${SOWOV}
    ln -sf ${LIBADD}${VERS} ${LIBADD}${SONAME}
Run Code Online (Sandbox Code Playgroud)

我试图在CFLAGS,CPPFLAGS甚至LDFLAGS中添加-fPIC.我也尝试在-shared标志之前和之后添加-fPIC.

-${CLINKER} -shared -fPIC -Wl,-soname,${SONAME} -o ${VERS}   *.o  ${PETSC_MAT_LIB}
Run Code Online (Sandbox Code Playgroud)

但我会像以前一样得到同样的错误.

如果我使用CFLAGS = -fPIC,我会得到一点同样的错误:

.../petsc/petsc-3.2-p6/arch-linux2-cxx-debug/lib/libpetsc.a(err.o): relocation R_X86_64_32 against `ompi_mpi_comm_self' can not be used when making a shared object; recompile with -fPIC.
Run Code Online (Sandbox Code Playgroud)

我已经阅读了与我的问题甚至远程相似的所有主题,但我一直无法解决这个问题.

use*_*685 9

当我尝试创建需要链接静态库的共享库时,我遇到了同样的问题.

我通过在CXXFLAGS中添加-fPIC来编译在静态库中存档的.o文件来解决了这个问题.


Mar*_*are 7

解决方案是使用 编译所有内容-fPIC,并将共享对象与-shared.

添加-fPICCFLAGSCXXFLAGS用于基于 make 的项目。