2011-11-10 60 views
14

我試圖用cmake skript在Windows上編譯基於boost的應用程序。 唯一的頭,庫做工精細,但cmakes未能找到庫(以下Boost庫找不到:boost_serialization)CMake的腳本的相關部分是:cmake沒有找到提升庫

#path where cmake can find additional libraries 
SET(CMAKE_PREFIX_PATH Libs) 

#boost 
SET(Boost_ADDITIONAL_VERSIONS "1.47" "1.47.0") 
SET(Boost_USE_STATIC_LIBS ON) 
find_package(Boost REQUIRED COMPONENTS serialization) 

我稱之爲一個文件夾「我的項目裏面存儲着諸如DevIL和boost之類的第三方庫,所以我首先設置了它。適用於惡魔和提高頭只東西,所以我認爲我不應該需要BOOST_ROOT變量。 增強安裝是boost.org的標準源代碼發佈版本,我使用bjam編譯。這些庫存儲在boost_1_47_0 \ bin.v2 \ libs中,我在構建過程中沒有更改任何內容。 我認爲這有點奇怪,boost_1_47_0 \ libs文件夾不包含任何庫文件,但bjam文件和其他東西,但這不應該是一個問題,因爲這縫是在Windows上建立提升的正常方法來源。

我查看了FindBoost.cmake的Debug輸出(我使用CMake 2.8的默認腳本),它沒有縫到bin.v2中。相反,它會搜索boost_ROOT/lib,但是當我將bin.v2 \ libs中的內容複製到lib時,它仍然找不到任何東西。

那麼,尋找提升的優雅方式是什麼,它也適用於其他普通最差分佈的平臺?

回答

5

嗯,我解決了這個問題,但我並不完全滿意我的解決方案。 在我看來,問題是,該BJAM創建一個複雜的文件夾結構。現在我只將庫文件從「boost_1_47_0 \ bin.v2 \ libs \ serialization \ build \ msvc-9.0 \ debug \ link-static \ threading-multi」複製到「boost_1_47_0 \ lib」。我必須手動執行此操作,但我沒有使用那麼多的增強庫,所以在我看來,這一步是可以的。我將把我的解決方案記錄在cmake腳本之外,所以其他用戶應該相處。

+5

閱讀說明書,瞭解舞臺和安裝。 – mloskot

+0

我閱讀了手冊(http://www.boost.org/doc/libs/1_48_0/more/getting_started/windows.html),但使用了選項5.2。我找到了包含所有庫的stage目錄,現在可以將其設置爲我的boost庫目錄,但下次我將嘗試選項5.3。 – JonathanK

+0

你也可以簡單地複製stage和boost(headers)目錄來做你自己的Boost安裝。例如boost/- > C:\ boost \ include \ boost和stage/* - > C:\ boost \ lib – mloskot

13

我會嘗試在您的CMakeLists.txt中設置BOOST_ROOT。我知道當設置Boost_ADDITIONAL_VERSIONS變量時,CMake 2.8.6會找到boost 1.47.0,因爲它在我設置了BOOST_ROOT的情況下適用於Windows。

以下是我有1個項目:

 

    set(BOOST_COMPONENTS_NEEDED serialization) 

    # The following verifyies that BOOST_ROOT is set properly. 
    if(NOT BOOST_ROOT AND NOT $ENV{BOOST_ROOT} STREQUAL "") 
     FILE(TO_CMAKE_PATH $ENV{BOOST_ROOT} BOOST_ROOT) 
     if(NOT EXISTS ${BOOST_ROOT}) 
      MESSAGE(STATUS ${BOOST_ROOT} " does not exist. Checking if BOOST_ROOT was a quoted string..") 
      STRING(REPLACE "\"" "" BOOST_ROOT ${BOOST_ROOT}) 
      if(EXISTS ${BOOST_ROOT}) 
       MESSAGE(STATUS "After removing the quotes " ${BOOST_ROOT} " was now found by CMake") 
      endif(EXISTS ${BOOST_ROOT}) 
     endif(NOT EXISTS ${BOOST_ROOT}) 

    # Save the BOOST_ROOT in the cache 
     if(NOT EXISTS ${BOOST_ROOT}) 
      MESSAGE(WARNING ${BOOST_ROOT} " does not exist.") 
     else(NOT EXISTS ${BOOST_ROOT}) 
      SET (BOOST_ROOT ${BOOST_ROOT} CACHE STRING "Set the value of BOOST_ROOT to point to the root folder of your boost install." FORCE) 
      #SET (BOOST_INCLUDEDIR ${BOOST_ROOT}/Include) 
      #SET (BOOST_LIBRARYDIR ${BOOST_ROOT}/lib) 
     endif(NOT EXISTS ${BOOST_ROOT}) 

    endif(NOT BOOST_ROOT AND NOT $ENV{BOOST_ROOT} STREQUAL "") 

    if(WIN32 AND NOT BOOST_ROOT) 
     MESSAGE(WARNING "Please set the BOOST_ROOT environment variable.") 
    endif(WIN32 AND NOT BOOST_ROOT) 

    set(Boost_ADDITIONAL_VERSIONS "1.47" "1.47.0") 
    set(Boost_DEBUG ON) 
    set(Boost_USE_STATIC_LIBS  OFF) 
    set(Boost_USE_MULTITHREADED  ON) 
    set(Boost_USE_STATIC_RUNTIME OFF) 
    FIND_PACKAGE(Boost 1.47.0 COMPONENTS ${BOOST_COMPONENTS_NEEDED}) 
    if(Boost_FOUND) 
     MESSAGE(STATUS "Setting up boost.") 
     include_directories(${Boost_INCLUDE_DIRS}) 
     if(Boost_DEBUG) 
      MESSAGE(STATUS "BOOST Libraries " ${Boost_LIBRARIES}) 
      FOREACH(BOOST_COMPONENT ${BOOST_COMPONENTS_NEEDED}) 
       STRING(TOUPPER ${BOOST_COMPONENT} BOOST_COMPONENT_UPCASE) 
       MESSAGE(STATUS "Boost " ${BOOST_COMPONENT} ": " ${Boost_${BOOST_COMPONENT_UPCASE}_LIBRARY}) 
       MESSAGE(STATUS "Boost " ${BOOST_COMPONENT} " Debug: " ${Boost_${BOOST_COMPONENT_UPCASE}_LIBRARY_DEBUG}) 
       MESSAGE(STATUS "Boost " ${BOOST_COMPONENT} " Release: " ${Boost_${BOOST_COMPONENT_UPCASE}_LIBRARY_RELEASE}) 
      ENDFOREACH(BOOST_COMPONENT) 
     endif(Boost_DEBUG) 
    endif(Boost_FOUND) 

+1

這幫了我很多,感謝這個腳本。我會在Boost_FOUND後面加上一行:LINK_DIRECTORIES($ {Boost_LIBRARY_DIRS}),否則它會一直說找不到庫。希望這可以幫助他人解決同樣的問題。 – Cross

+0

- 無法找到Boost Boost版本:1.60.0 Boost包含路徑:/ usr/include Boost檢測到的版本太舊。請求的版本是1.64(或更新)。 .....即使添加上面提到的註釋(Windows 10/CLion) –

1

我以前曾與這是一個問題。由於某些原因,b2(aka bjam)創建了帶有前導「lib」的boost庫。 cmake腳本將不會查找名爲libboost_thread.lib的文件,它只會找到boost_thread.lib。刪除前導lib和cmake應該找到它們。

+0

我試過了,但它沒有幫助現在名稱就像boost_serialization-vc90-mt-1_47.lib而不是libboost_serialization -vc90-mt-1_47.lib - 如果我想使用更多的庫,我真的不想重命名它們,以便cmake可以找到它們。在我看來,find_package應該爲我做所有的工作...... – JonathanK

+3

不要重命名這些庫。 「lib」前綴是針對靜態庫的,前綴不適用於DLL。您應該使用runtime-link = shared來構建。 –

+0

@AndreasHaferburg在我的情況下,我特意試圖將靜態鏈接提升到我的應用程序中。 –

0

您可以在以下選項添加到cmake的命令行告訴CGAL使用靜態Boost庫:

-DCGAL_Boost_USE_STATIC_LIBS=true 
0

來到這裏有類似問題,只是想說,我的修補程序相似,但不一模一樣。我的安裝前綴是C:\ lib \ boost \ boost_1_57_0。我設置了一個指向該目錄的BOOST_ROOT環境變量,但CMake(3.1.0)仍然找不到標題。我意識到這些標頭默認安裝到C:\ lib \ boost \ boost_1_57_0 \ include \ boost-1_57 \ boost。我不打算運行多個版本,所以我剛搬到最終升壓目錄下一個並取消了升壓1_57目錄,並結束了與頭位置:

C:\lib\boost\boost_1_57_0\include\boost 

而且CMake的發現一切。