2017-02-12 34 views
1

什麼都對C進行必要的條件創建和使用適當的soname版本和相關的符號鏈接安裝共享對象?的CMake不會產生。所以版本和soversion符號鏈接

我最近升級我的系統,什麼使用的cmake 2.8工作,不與CMake的3.7工作了。我檢查了最新的文檔,但我無法理解它,關於我的問題。

我曾經有過安裝.so文件,與真實的.so與完整版的文件,除了符號鏈接。

pluginname.so.1 => pluginname.so.1.1.0 
pluginname.so.1.1.0 

現在,cmake的唯一製造和安裝 pluginname.so 沒有任何版本的後綴,也不符號鏈接。

我沒有在任何地方使用NO_SONAME:
https://cmake.org/cmake/help/v3.7/prop_tgt/NO_SONAME.html#prop_tgt:NO_SONAME

add_library(${PLUGIN_NAME} MODULE ${SRC}) 

# I call message(...) to check that the values are indeed set: 
message("plugin ${PLUGIN_NAME}") 
message("version ${CORE_MAJOR_VERSION}.${PLUGIN_MAJOR_VERSION}.${PLUGIN_BUGFIX_VERSION}") 
message("soversion: ${CORE_MAJOR_VERSION}") 
message("prefix ${PLUGIN_PREFIX}") 

if (NOT NO_SONAME) 
    message("Ok, no_soname is not set!") 
endif() 

set_target_properties(${PLUGIN_NAME} PROPERTIES 
    VERSION ${CORE_MAJOR_VERSION}.${PLUGIN_MAJOR_VERSION}.${PLUGIN_BUGFIX_VERSION} 
    SOVERSION ${CORE_MAJOR_VERSION} 
    PREFIX ${PLUGIN_PREFIX} 
) 
install(TARGETS ${PLUGIN_NAME} DESTINATION ${PLUGIN_INSTALL_DIR}) 

什麼其他調試策略會在這裏工作?

我曾試圖改變add_library($ {} PLUGIN_NAME MODULE $ {} SRC)符合更換MODULE SHARED,但似乎並不有所作爲。

+1

我回答之後,我只是重新閱讀你的問題,看到你說你用'SHARED'嘗試過...當你嘗試我相信你刪除了構建目錄並開始一個新的配置cmake ...: 'rm -rf build && mkdir build && cd build && cmake ..',對嗎? – fedepad

+0

你可以做的一件事是檢查構建目錄,如果那些創建那裏。另外:你在做什麼操作系統? – fedepad

+1

它的工作原理。謝謝。我正在使用gentoo。我確定我在構建目錄,cmake等等中做了rm -rf,並且我嘗試了SHARED,但顯然我沒有在同一時間完成這兩個任務。我再試一次,它的工作原理。非常感謝您的寶貴時間! – augustin

回答

3

您正在添加「MODULE」庫而不是「SHARED」庫。

我想這可能與以下幾點:
https://gitlab.kitware.com/cmake/cmake/commit/f799ffb5cb895855ac2aba54765622b81db5be38

,並在這裏再次強調: https://gitlab.kitware.com/cmake/cmake/raw/f799ffb5cb895855ac2aba54765622b81db5be38/Help/release/dev/modules-no-soname.rst

  • SONAME領域不再設置與創建MODULE庫:命令:add_library命令。 MODULE
    庫是爲了在運行時顯式動態加載。他們 不能鏈接,所以SONAME是沒有用的。

之前,你可能已經設置SONAME並有VERSIONSOVERSION組也爲MODULE庫。
這是我能想到的唯一的事情就是防止你設置你的庫VERSIONSOVERSION

更多的參考資料:
https://gitlab.cern.ch/dss/eos/commit/18ff0746ff4bc1263648fe3fdda79075ce262093
https://gitlab.cern.ch/dss/eos/commit/a7a6d486168e4de9a25eddd84cb19af0bab1ab5f


重要提示:當你MODULE之間切換SHARED配置或反之亦然,這是一個很好的做法,刪除 「舊」 CMake的配置文件。
如果你的版本是源代碼外的(我建議)並且該目錄被稱爲build,那麼在你的項目的根目錄中,當你更改了CMakeLists.txt中的所需配置之後,你將執行如下操作:

rm -rf build && mkdir build && cd build && cmake .. 

這將確保您在構建項目之前從乾淨的配置狀態開始。