私は特定の問題を抱えていますが、最初に一般的な方法でそれを定式化することを試みましょう:
私はLinuxで作業しています(正確にはopenSUSE 12.2)。ツールチェーンは非常に標準的で、make、OpenMPI mpicc(GCCを使用)などを使用します。
私の問題は、基本的に、makefile内のマクロとして一連のリンクコマンドが与えられることです(つまり、「-lsomelib -L / some / path-lanotherlib」など)。これらのライブラリを使用するライブラリ(libmineと呼びましょう)を作成したいのですが、libmineの利用者が、使用するライブラリを気にする必要はありません(つまり、-lmineを実行するだけで、気にしないでください)。 -lsomelibなどについて)。
具体的には、 petscを扱っています。これは、自分でロールするのではなく、makefileの1つをテンプレートとして使用することを強くお勧めします。私の目的のための最小限のmakefileは次のようになります。
include ${PETSC_DIR}/conf/variables
include ${PETSC_DIR}/conf/rules
mine.o: mine.c chkopts
${CC} ${CFLAGS} ${PETSC_CCPPFLAGS} -o mine.o -c mine.c ${PETSC_KSP_LIB}
これが私mine.c
のライブラリのソースコードであり、${PETSC_KSP_LIB}
リンク命令を含む文字列です。私のマシンでは、具体的には次のとおりです。
-L/usr/local/petsc/petsc-3.3-p5_user0/linux-gnu-user0/lib -lpetsc -lX11 -lpthread -Wl,-rpath,/usr/local/atlas -L/usr/local/atlas -llapack -lblas -L/usr/lib64/mpi/gcc/openmpi/lib64 -L/usr/lib64/gcc/x86_64-suse-linux/4.7 -L/usr/local/petsc/petsc-3.3-p5_user0 -L/opt/AMDAPP/lib/x86_64 -L/usr/x86_64-suse-linux/lib -lmpi_f90 -lmpi_f77 -lgfortran -lm -lgfortran -lm -lgfortran -lm -lm -lquadmath -lm -ldl -lmpi -lnsl -lutil -lgcc_s -lpthread -ldl
これらのライブラリはほとんど静的ライブラリです(おそらくそこにもいくつかの動的ライブラリがあります)。
mine.o(または完成したライブラリlibmine.a)に必要な情報をすべて含めて、libmineを使用する他のアプリケーションをコンパイルするときに、全体ではなくlibmineにリンクするだけでよいようにする方法を探しています。にリストされているライブラリのホスト${PETSC_KSP_LIB}
。
これが簡単にできることを願っていますが(?)、リンクプロセス全体が非常に不安定です。たとえば、すべてのライブラリが静的または動的である場合、より簡単に実行できますか?また、動的ライブラリを静的に含める必要はないことにも注意してください。たとえば、フォルダの追加LD_LIBRARY_PATH
はまったく問題ありません。重要なのは、他のプロジェクトでそのライブラリを使用するときに、petscベースのライブラリで使用されるライブラリのリストについて心配する必要がないことです。