0

カスタム OpenFOAM アプリケーションをコンパイルしようとしています。私のビルド手順は CMake を使用しています (ただし、これが現在の問題と関係があるかどうかはわかりません)。

OpenFOAM に詳しい人にとっては、これは pisoFoam アプリケーションであり、問​​題のライブラリは incompressibleLESModels.so ライブラリです。

プロジェクトは問題なくビルドされます。そして、IncompressibleLESModels ライブラリを利用する必要があるまで実行されます。この時点で、アプリはそのライブラリについて何も知らないと主張し、停止します。

CMake スクリプト内の TARGET_LINK_LIBRARIES に incompressibleLESModels ライブラリを (他の必要なすべてのライブラリと共に) 含めました。

OpenFOAM を使用すると、ユーザーは実行時に入力ファイルを介してライブラリにリンクできます。この方法は問題なく機能します (つまり、アプリを incompressibleLESModels ライブラリに動的にロードして実行することができます)。しかし、私はむしろこの方法に頼りたくありません。そして、標準の OpenFOAM アプリはこれを行いません。

実行可能ファイルで ldd を実行すると、incompressibleLESModels ライブラリが明らかにライブラリのリストにありません。

つまり、リンカがリンク段階でライブラリが不要であることを検出し、リンクしないことを選択したかのようです。私が理解していることから、これは gcc に渡された定義、特に add-needed または as-needed が原因である可能性があります。そして必要に応じて。

CMake の ADD_DEFINITIONS コマンドを使用して、次の定義を追加しています。

-DWM_DP  -m64  -Dlinux64  -Wall -Wextra -Wno-unused-parameter -Wold-style-cast 
-Wnon-virtual-dtor -O3  -DNoRepository -ftemplate-depth-100 -fPIC -Xlinker 
--add-needed -Xlinker --no-as-needed

どんなアイデアでも大歓迎です。

よろしく、 マドレーヌ

4

1 に答える 1

0

cmake を使用しているため、add_definitions を使用する代わりにディレクティブをリンクするには、target_link_libraries を使用します

target_link_libraries(<targetname> "-Wl,--no-as-needed")
target_link_libraries(<targetname> <libraries that you want to link even if apparently not necessary>)
target_link_libraries(<targetname> "-Wl,--add-needed")
target_link_libraries(<targetname> <libraries that you want to link according to the "default" criteria>)

参照: http://www.cmake.org/cmake/help/v2.8.11/cmake.html#command:target_link_libraries

また、-fPIC などについては、CMAKE_CXX_FLAGS などの変数を使用し、それにフラグを追加することをお勧めします。

セット (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fPIC")

注: 通常、リスト要素はセミコロンで区切られているため、list と append を使用しても機能しません。CMAKE_CXX_FLAGS_DEBUG や CMAKE_CXX_FLAGS_RELEASE など、ビルドの種類に応じてフラグを設定できます。

http://www.cmake.org/cmake/help/v2.8.11/cmake.html#variable:CMAKE_LANG_FLAGS_DEBUG http://www.cmake.org/cmake/help/v2.8.11/cmake.html#variable:CMAKE_LANG_FLAGS_RELEASE

于 2013-06-18T12:39:59.707 に答える