2013-03-22 153 views
16

我想使用CMake將我的項目鏈接到我的共享庫。圖書館只在少數幾個項目之間共享,而且很小,所以我真的很想在鏈接之前構建它。每次構建它似乎都比維護最新的預編譯版本更好,因爲我會將其與項目一起更改。它是分開的,因爲它包含了我在下一個項目中幾乎可以肯定需要的東西。使用CMake靜態鏈接到項目外的庫

如何配置CMake來完成它?

我爲相關項目當前的CMakeLists.txt看起來是這樣的:

find_package(Boost REQUIRED COMPONENTS unit_test_framework) 

include_directories(${BaumWelch_SOURCE_DIR}/../../grzesLib/src 
        ${BaumWelch_SOURCE_DIR}/src 
        ${Boost_INCLUDE_DIRS}) 

if(CMAKE_COMPILER_IS_GNUCXX) 
    add_definitions(-g -std=c++11 -Wall -Werror -Wextra -pedantic -Wuninitialized) 
endif() 


# Create the unit tests executable 
add_executable(
baumwelchtests stateindextest.cpp baumiterationtest.cpp baumwelchtest.cpp sampleparameters.cpp sdetest.cpp 
# Key includes for setting up Boost.Test 
testrunner.cpp 
# Just for handy reference 
exampletests.cpp 
) 

# Link the libraries 
target_link_libraries(baumwelchtests ${Boost_LIBRARIES} baumwelchlib grzeslib) 

但顯然編譯失敗:

/usr/bin/ld: cannot find -lgrzeslib 
+0

如果您將.a添加到libname,它會工作嗎? – drescherjm 2013-03-22 12:01:24

+0

@drescherjm,這個庫在那個時候甚至沒有被編譯過,而且我也沒有指定二進制文件的位置,所以我確定將.a添加到libname中將無濟於事。 – Grzenio 2013-03-22 15:07:04

回答

26

你提到你想構建庫,而不是使用預編譯版本。如果庫有一個CMakeList,你應該使用add_subdirectory(path/to/the/library/source/directory)來添加它。它將成爲你的項目的一個子項目,你可以在你的CMakeList中正常使用它的目標名稱。

請注意,雖然該命令被稱爲add_ 子目錄,它可以是磁盤上的任意目錄;它不一定是主項目的源目錄的子目錄。如果它不是一個子目錄,你也必須爲它明確指定一個二進制目錄。示例:

add_subdirectory(/path/to/the/library/source/directory subproject/grzeslib) 

第二個參數如果作爲相對路徑給出,則相對於CMAKE_CURRENT_BINARY_DIR進行解釋。

+2

我試過,但我得到以下錯誤:'add_subdirectory沒有給出二進制目錄,但給定源 目錄「/ home/ga1009/PhD/cpp/grzesLib/src」不是 的子目錄「/ home/ga1009 /博士/ CPP/PMI/CPP」。當指定一個樹外源代碼時,必須明確指定二進制目錄。我應該怎樣處理這個問題? – Grzenio 2013-03-22 15:03:26

+0

@Grzenio我已將信息添加到答案。 – Angew 2013-03-22 17:28:43

+0

我得到@Grzenio的相同錯誤...它不允許我放置任何任意目錄。 – 2016-09-26 18:27:33