2017-08-25 3 views
1

仕事中の私のプロジェクトの1つで、以下のことが気付き、私に尋ねられました。 バイナリは "Relink"フォルダと呼ばれるフォルダにリンクして再度リンクします。 私もチェックし、バイナリは2か所にあり、リンクは2回発生します。使用CMake:ディレクトリを再リンクしてダブルリンク

CMAKEのバージョンは2.6です - パッチ2

私はCMAKEで使用されてインストールする場合は、ビルドフォルダに、生成されたcmake_install.cmakeは、次のエントリ

 IF(NOT CMAKE_INSTALL_COMPONENT OR "${CMAKE_INSTALL_COMPONENT}" MATCHES "^(Unspecified)$") 
     IF("${CMAKE_INSTALL_CONFIG_NAME}" MATCHES "^([Dd][Ee][Bb][Uu][Gg])$") 
     FILE(INSTALL DESTINATION "${CMAKE_INSTALL_PREFIX}/bin" TYPE EXECUTABLE FILES "/path/to/binary/file/folder/CMakeFiles/CMakeRelink.dir/<binary name>")..... 

を持っていることがわかった、とCOMPONENT installコマンドで作成されず、ビルドがDebugビルドの場合、このRelink Folderが作成され、バイナリが2回リンクされます。問題はなぜこれが起こるかです。 2回リンクすると、ビルド時間が長くなります。 これはどのような目的を果たしますか。 インストールコマンドを省略するか、ビルドがデバッグビルドの場合、これは発生しません。 ビルドがデバッグビルドであるかどうか、なぜそうではないのですか? ドキュメントとこのサイトを検索しましたが、説明が見つかりませんでした。

出力例:以下CMAKEListsエントリがだから、デバッグビルドやショーに、この動作をインストールする以外のコンポーネントとしてこれを構築

install(TARGETS <binary/library name> 
     RUNTIME 
     DESTINATION "bin") 

に追加されたときに

..... 
Linking CXX shared library lib<library-name>.so <== Linking the first time 
[100%] Built target <another library name> 
[ 15%] Built target <another-library-name1> 
[ 92%] Built target <another-library-name2> 
[ 92%] Built target <another-library-name3> 
[100%] Built target <another-library-name4> 
[100%] Built target <another-library-name5> 
Linking CXX shared library CMakeFiles/CMakeRelink.dir/lib<library-name>.so <== Second linking. 

この再リンクディレクトリが現れます JenkinsビルドはRelease/Optimizedビルドであり、Debugビルドではないため、Jenkinsでビルドしたときに同じコードにはこれがありません。

+0

問題を示す最小の実例を作成してください。私はあなたの質問に記述された問題を決して持っていなかった。 – usr1234567

+0

こんにちは。私は、ライブラリ名を削除して、サンプル出力の詳細を与えるようにテキストを更新しました。 –

答えて

1

バイナリのインストール前に再リンクするのは、ビルドのRPATHを保存することと大いに関係しています。

私はCOMPONENT定義の初期チェックを完了し、生成されたCMakeを見て、新しい条件を示しました。 は、コンポーネントの建物が有効になっているテストプロジェクトで、だからここ http://public.kitware.com/pipermail/cmake/2006-October/011377.html

いくつかの関連情報を発見、のためのcmakeののINSTALLコマンドを、再び再リンクこの時間を満たすために別の条件で発生します。この場合、プロジェクトで有効になっているinstall_publicオプションがチェックされます。

IF(NOT CMAKE_INSTALL_COMPONENT OR "${CMAKE_INSTALL_COMPONENT}" MATCHES "^(install_public)$") 
IF("${CMAKE_INSTALL_CONFIG_NAME}" MATCHES "^([Dd][Ee][Bb][Uu][Gg])$") 
    FILE(INSTALL DESTINATION "${CMAKE_INSTALL_PREFIX}/lib64" TYPE SHARED_LIBRARY  

#install CMakeRelink.dir/<library_name>.so.<library_version> ...... 

ここではいくつかの情報だけでなく上記のリンクに再リンクするためのドキュメント https://cmake.org/Wiki/CMake_2.8.0_Docs

検索インチ 私はCMAKELists.txtを変更し、アプリケーションCMAKEListでCMAKE_INSTALL_RPATHをOFFに設定して別のビルドをテストしました。 これもダブルリンクを停止しました。

関連する問題