だから私は32ビットで何かをコーディングしてきましたが、昨日はdllを構築する必要があり、それに関していくつかの問題がありました。とにかく私はそれらを解決しました ここ 。
残念ながら、すべてが機能していると思ったとしても、64bitで動作するプログラムとメイクファイルを他のコンピューターに移動した場合はそうではないことがわかりました。
だから私の問題は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
ここに私のメイクファイルがあります
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.
私は自分の問題と少しでも似ているトピックをすべて読みましたが、これを理解することができませんでした。
解決策は、すべてを-fPIC
でコンパイルし、共有オブジェクトを-shared
でリンクすることでした。
Make_basedプロジェクトの場合、-fPIC
をCFLAGS
またはCXXFLAGS
に追加します。
静的ライブラリをリンクする必要がある共有ライブラリを作成しようとすると、同じ問題が発生しました。
-fPICをCXXFLAGSに追加して、静的ライブラリにアーカイブされた.oファイルをコンパイルすることで問題を解決しました。
CentOS 6.5でxmlrpc-c-1.06.41をコンパイルしようとすると、同じリンクの問題が発生しました。これは、以下によって解決されました。/src/cppで、Makefileを変更しました。
CXXFLAGS = $(CXXFLAGS_COMMON) $(CFLAGS_PERSONAL) $(CADD) -shared -fPIC
フラグに関する詳細情報を見つけることができます link
「-fPIC」を追加した後もこの問題が解決しない場合は、すべての.oファイルを消去して、再度実行してください。
私もこの問題に直面しています。 @Mareと@ user2391685を使ってみたところ、うまく機能します:
-fPIC
ファイルにcomepileされるときに.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/