2017-08-25 23 views
1

在我的一個項目在工作中,以下被注意到並問我。 二進制文件將鏈接到一個名爲「重新鏈接」文件夾的文件夾中,然後再次鏈接。 我也檢查和二進制是在兩個地方和連接發生兩次。CMake:重新鏈接目錄和雙鏈接

使用

CMake的版本是2.6 - 補丁2.

我發現,在build文件夾中,產生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>")..... 

如果Install是在CMake的使用,COMPONENT不是使用安裝命令創建的,而構建是一個調試版本,則創建此重鏈接文件夾並將二進制鏈接兩次。問題是爲什麼會發生這種情況? 連接兩次會增加您的構建時間。 那麼這有什麼用途。 如果省略了Install命令或者構建版本是Debug版本,則不會發生這種情況。 爲什麼不這樣做,爲什麼它是相關的,如果構建是一個調試版本? 我搜索了文檔和此網站,但找不到解釋。

輸出示例:

..... 
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. 

這個目錄重新鏈接時顯示以下CMAKELists條目添加

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

所以建立這個作爲一個調試版本和非組件安裝顯示了這種行爲。 在Jenkins上構建時的相同代碼沒有這個,因爲Jenkins構建版本是Release/Optimized版本,而不是Debug版本。

+0

請創建一個最小的工作示例,顯示您的問題。我從來沒有在你的問題中描述的問題。 – usr1234567

+0

嗨。我更新了文本以提供有關示例輸出的更多詳細信息,刪除了庫名稱。 –

回答

1

看起來像安裝二進制文件之前的Relinking與保存構建中的RPATH有很大關係。

所以我試着完成COMPONENT定義的初始檢查,然後看到生成的CMake,它顯示了新的條件來完成。 在這裏找到一些相關的信息,以便在測試項目中啓用COMPONENT建設,爲安裝CMake的命令,重新鏈接再次出現 http://public.kitware.com/pipermail/cmake/2006-October/011377.html

與其他條件滿足這個時候。在這種情況下,將檢查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

搜索重新連接在上面的鏈接。 因此,我通過changin CMAKELists.txt測試了另一個版本,並在應用程序CMAKEList中將CMAKE_INSTALL_RPATH設置爲OFF。 這也停止了雙鏈接。