所以我一直在编写32位的内容,昨天我需要构建一个dll而且我遇到了一些问题。无论如何,我解决了他们here。
不幸的是,即使我认为一切都在运行,我发现当我在64位上运行我的程序和makefile在其他计算机上运行时并非如此,因为你可以猜到发生了什么......
所以我的问题与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
这是我的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}
我试图在CFLAGS,CPPFLAGS甚至LDFLAGS中添加-fPIC。我还尝试在-shared标志之前和之后添加-fPIC。
-${CLINKER} -shared -fPIC -Wl,-soname,${SONAME} -o ${VERS} *.o ${PETSC_MAT_LIB}
但我会像以前一样得到同样的错误。
如果我使用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.
我已经阅读了与我的问题甚至远远相似的所有主题,但我一直无法解决这个问题。
答案 0 :(得分:9)
当我尝试创建需要链接静态库的共享库时遇到了同样的问题。
我通过在CXXFLAGS中添加-fPIC来编译静态库中存档的.o文件来解决这个问题。
答案 1 :(得分:4)
解决方案是使用-fPIC
编译所有内容,并使用-shared
链接共享对象。
为基于生成的项目添加-fPIC
到CFLAGS
或CXXFLAGS
。
答案 2 :(得分:4)
尝试在CentOS 6.5中编译xmlrpc-c-1.06.41,遇到了相同的链接问题,该问题由以下内容解决: 在./src/cpp中,我修改了Makefile:第142行到
CXXFLAGS = $(CXXFLAGS_COMMON) $(CFLAGS_PERSONAL) $(CADD) -shared -fPIC
有关标志的更多信息可以在link
找到答案 3 :(得分:2)
如果在添加“-fPIC”后仍然存在此问题,请尝试清除所有.o文件,然后重新运行
答案 4 :(得分:1)
我也遇到了这个问题。 当我尝试使用@Mare和@ user2391685时,它可以很好地工作:
在发送到-fPIC
文件时使用.o
:
例如:
gcc -Wall -fPIC -c hello.c -I./ -I/usr/lib/jvm/java/include/ -I/usr/lib/jvm/java/include/linux/
然后你可以建立一个.so
文件:
gcc -Wall -rdynamic -shared -o libhello.so hello.o Main.h -I/usr/lib/jvm/java/include/ -I/usr/lib/jvm/java/include/linux/
答案 5 :(得分:0)
这是一种魅力。对于谁还不知道这个简单易用的人
一个名为 Makefile.am 或 Makefile 的打开文件。只需完成您的配置即可。
在此代码 _a_CXXFLAGS = 或只是 CXXFLAGS =
在该文件 -shared -fPIC
之后添加此示例
之前
crypto_libmubdi_crypto_a_CXXFLAGS = $(AM_CXXFLAGS)$(PIC_FLAGS)$(CXXFLAGS_COMMON)$(CFLAGS_PERSONAL)$(CADD)
之后
crypto_libmubdi_crypto_a_CXXFLAGS = $(AM_CXXFLAGS)$ {PIC_FLAGS)$ {CXXFLAGS_COMMON)$ {CFLAGS_PERSONAL)$ {CADD)-共享-fPIC
这些错误导致我们不共享文件或需要-fPIC字符串/标签。
注意:我在构建区块链方面经验丰富。这导致添加了crypto / sph_sha2big.c
答案 6 :(得分:0)
在命令行中:
cmake -DCMAKE_EXE_LINKER_FLAGS="-no-pie"
或者在 CMakeList.txt 中:
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -no-pie")