私の問題はかなり簡単ですが、それを解決する方法がわかりません。makeファイルを使用していない場合は、コンパイルとライブラリを作成してリンクする方法を知っています。これは、arを個別に呼び出すだけで、すべてが正常に行われるためです。
とにかく、私はpetscライブラリを使用しており、それらが提供するmakefileを使用しています。
CFLAGS =
FFLAGS =
CPPFLAGS =
FPPFLAGS =
LOCDIR = /home/user/.../.../ # Working folder
EXAMPLESC = main.cpp class.cpp #.cpp file names here
EXAMPLESF =
#MANSEC = Mat I don't know what this is but it seems to work without it.
include ${PETSC_DIR}/conf/variables
include ${PETSC_DIR}/conf/rules
myProgram: main.o class.o chkopts
-${CLINKER} -o myProgram main.o class.o ${PETSC_MAT_LIB}
${RM} main.o class.o
include ${PETSC_DIR}/conf/test
ARFLAGSはデフォルトで-rvになるので、次のような情報をどこに提供すればよいですか?
ar -rv libclassdll.a class.o
-L./-lclassdllはどこに追加すればよいですか?
私はmakefilesの新人なので、ここで少し迷っています:<
行をに変更しようとしました
myProgram: main.o class.o chkopts
-${CLINKER} -o myProgram main.o class.o ${AR} libclassdll.a class.o ${PETSC_MAT_LIB}
${RM} main.o class.o
そして、私のコンパイルコマンドはmpicxx -o myProgram main.o class.o / usr / bin / ar / libclassdll.a class.o -L(ここに多くのリンクがあります)のようで、少なくとも次のように表示されます:g ++ classdll.aそのようなファイルやディレクトリはありません。
だから私のためにlibファイルさえ生成しません。だからどんなアイデアも本当にありがたいです。
別のマシンにmakefileをアップロードしたときの新しい問題、現在のmakefileは次のようになります
LibMyClass.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}
これは1台のマシンで機能しますが、他のマシンでは次のエラーが発生します
/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
もちろんパスを変更しましたが、「g ++ -shared -Wl、-soname、libmyclass.so.1 -olibmyclass.so.1.0MyClass.o」または「g++」と入力しても、他の種類の問題を示していると思います。 -fPIC -share..."同じエラーが発生します。