2013-06-01 26 views
2

我試圖在使用CMake的構建環境中包含外部庫。我不是試圖在本地系統上安裝它(事實上,我寧願不是這樣做,我不希望/usr/local堵塞各種類型的庫);我只想得到結果libxml2.a可用於鏈接我的可執行文件。我可以用的CMakeLists.txt以下罰款構建它:CMake構建和鏈接到庫,而不安裝到/ usr/local或其他地方

set (LIBXML_PATH ${MY_SOURCE_DIR}/libxml2-2.9.1) 
add_custom_target (build_libxml ALL 
    COMMENT "Building libxml" 
    COMMAND ./configure --prefix=/tmp 
    COMMAND make 
    WORKING_DIRECTORY ${LIBXML_PATH} 
) 

但我仍然有以下煩惱:

1)這是擺在首位的正確方法,對於一般將使用configuremake構建的庫建成CMake環境的目的?

2)如何將我的build輸出目錄下獲得所產生的庫(即libxml2.a)?

3)如何鏈接到我的可執行文件的庫?

我試着用

ADD_LIBRARY(xml2 STATIC libxml2.a) 

一個繁瑣的解決方案,但它好像有必須大於牽引整個庫的內容轉換成...圖書館更好的辦法。

謝謝。

回答

1

您需要更清楚地瞭解CMake發生了什麼。現在只能看到它有一些自定義命令,它會每次運行。與使用COMMAND的add_custom_target不同,我發現使用add_custom_command更好。事情是這樣的:

set (LIBXML_PATH ${MY_SOURCE_DIR}/libxml2-2.9.1) 
add_custom_command(
    OUTPUT libxml2.a 
    COMMENT "Building libxml" 
    COMMAND ./configure --prefix=/tmp 
    COMMAND make 
    WORKING_DIRECTORY ${LIBXML_PATH} 
) 
target_link_libraries(your-program libxml2.a) 

通過做這種方式,可以的CMake瞭解您的自定義命令的必備品是libxml2.a,當CMake的看到上依賴的東西,它會運行命令(如果沒有按庫已不存在)。

+0

謝謝。我無法完全理解我所從事的工作,現在我正嘗試一種完全不同的方法,因此我無法將其作爲「答案」進行測試。不過,爲了欣賞而投票贊成。 – wilsonmichaelpatrick