1

私は特定の問題を抱えていますが、最初に一般的な方法でそれを定式化することを試みましょう:

私は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ベースのライブラリで使用されるライブラリのリストについて心配する必要がないことです。

4

1 に答える 1

1

共有ライブラリを静的ライブラリに変換することは簡単ではありません

複数の静的ライブラリを1つに結合するには、それらを解凍してから、新しいライブラリをビルドします(粗雑ですが効果的です)。

ar -xv somelib.a
ar -xv anotherlib.a
...

ar -r libmine.a *.o

より洗練されたソリューションを1つのステップで聞いたことがありますが、承認する前にテストしたいと思います...

于 2013-01-31T16:20:13.883 に答える