2013-05-02 153 views
4

我已經搜索了幾個小時如何解決這個問題,我試過的一切都沒有工作。 我試圖靜態鏈接某些庫,(libPoco,libmysqlcpp,libmysqlclient,libssl)。cmake忽略靜態庫鏈接請求

我正在使用cmake,雖然我正在定義靜態庫,但cmake只是查找動態庫。我知道我的文件系統中有靜態存檔所需的所有庫,並且我知道它們在哪裏。

set(CMAKE_LIBRARY_PATH ${CMAKE_LIBRARY_PATH} 
       /lib 
       /usr/lib 
       /usr/lib64 
       /usr/local/lib 
       /usr/local/lib64 
       /usr/lib/x86_64-linux-gnu) 

find_library(POCO_NET NAMES libPocoNet.a PATHS CMAKE_LIBRARY_PATH STATIC IMPORTED) 
find_library(POCO_UTIL NAMES libPocoUtil.a PATHS CMAKE_LIBRARY_PATH STATIC IMPORTED) 
find_library(POCO_XML NAMES libPocoXML.a PATHS CMAKE_LIBRARY_PATH STATIC IMPORTED) 
find_library (MYSQL_CLIENT NAMES libmysqlclient.a PATHS CMAKE_LIBRARY_PATH STATIC IMPORTED) 
find_library (MYSQL_CPP NAMES libmysqlpp.a PATHS CMAKE_LIBRARY_PATH STATIC IMPORTED) 
find_library (LIBSSL NAMES libssl.a PATHS CMAKE_LIBRARY_PATH STATIC IMPORTED) 

if (POCO_NET AND POCO_UTIL AND POCO_XML AND MYSQL_CLIENT AND MYSQL_CPP AND LIBSSL) 
    message(STATUS ${POCO_NET}) 
    message(STATUS ${POCO_UTIL}) 
    message(STATUS ${POCO_XML}) 
    message(STATUS ${MYSQL_CLIENT}) 
    message(STATUS ${MYSQL_CPP}) 
    message(STATUS ${LIBSSL}) 
    target_link_libraries(icarus 
      PocoNet 
      PocoUtil 
      PocoXML 
      mysqlpp 
      mysqlclient 
      ssl) 
else() 
    message(FATAL_ERROR "FATAL ERROR: missing library") 
endif (POCO_NET AND POCO_UTIL AND POCO_XML AND MYSQL_CLIENT AND MYSQL_CPP AND LIBSSL) 

但是當我運行cmake的..我得到的是:

-- /usr/local/lib/libPocoNet.so 
-- /usr/local/lib/libPocoUtil.so 
-- /usr/local/lib/libPocoXML.so 
-- /usr/lib/x86_64-linux-gnu/libmysqlclient.so 
-- /usr/lib/libmysqlpp.so 
-- /usr/lib/libssl.so 

當我嘗試編譯,我得到了一個未定義的引用,因爲我使用的是-static標誌。 我在這裏錯過了什麼? 有沒有辦法強制cmake查找靜態庫而不是動態庫? 我對此有錯誤嗎? 謝謝。

回答

7

看起來你在add_libraryfind_library命令之間有點混淆。 find_library不需要參數STATICIMPORTED

此外,你還沒有裹${}CMAKE_LIBRARY_PATHfind_library調用之內,所以你有效地傳遞的「CMAKE_LIBRARY_PATH」 3條路徑,「靜態」和「進口」向CMake的搜索程序,而不是預期的6條路徑${CMAKE_LIBRARY_PATH}

最後,由於${CMAKE_LIBRARY_PATH}已經是CMake搜索例程中的第一個端口,因此不需要將其明確添加到find_library命令中。

所以,你可以這樣做:

set(CMAKE_LIBRARY_PATH ${CMAKE_LIBRARY_PATH} 
       /lib 
       /usr/lib 
       /usr/lib64 
       /usr/local/lib 
       /usr/local/lib64 
       /usr/lib/x86_64-linux-gnu) 

find_library(POCO_NET NAMES libPocoNet.a) 
find_library(POCO_UTIL NAMES libPocoUtil.a) 
find_library(POCO_XML NAMES libPocoXML.a) 
find_library(MYSQL_CLIENT NAMES libmysqlclient.a) 
find_library(MYSQL_CPP NAMES libmysqlpp.a) 
find_library(LIBSSL NAMES libssl.a PATHS) 

if(POCO_NET AND POCO_UTIL AND POCO_XML AND MYSQL_CLIENT AND MYSQL_CPP AND LIBSSL) 
    message(STATUS ${POCO_NET}) 
    message(STATUS ${POCO_UTIL}) 
    message(STATUS ${POCO_XML}) 
    message(STATUS ${MYSQL_CLIENT}) 
    message(STATUS ${MYSQL_CPP}) 
    message(STATUS ${LIBSSL}) 
    target_link_libraries(icarus 
      ${POCO_NET} 
      ${POCO_UTIL} 
      ${POCO_XML} 
      ${MYSQL_CLIENT} 
      ${MYSQL_CPP} 
      ${LIBSSL}) 
else() 
    message(FATAL_ERROR "FATAL ERROR: missing library") 
endif() 
+1

感謝您的答覆!我做了你所說的,但我仍然從cmake獲得相同的輸出(顯示* .so),並嘗試將靜態鏈接鏈接到動態對象。它似乎仍然忽略了* .a – 2013-05-02 19:05:56

+3

沒關係,你是對的,cmake被緩存,刪除調試目錄並再次嘗試,現在它使用* .a。謝謝 ! :) – 2013-05-02 19:12:38

+5

另外,FIY:設置(CMAKE_FIND_LIBRARY_SUFFIXES .a $ {CMAKE_FIND_LIBRARY_SUFFIXES}) – 2013-05-02 19:32:11