2012-02-16 101 views
1

這是我第一次使用C/C++以及CMake,所以可能會有很多錯誤。我的Cmake libxml2項目出了什麼問題?

我已經使用CMake和libxml2設置了一個最小的項目。它看起來像這樣:

xmltest/
xmltest/source/
xmltest/source/CMakeLists.txt
xmltest/source/testxml.c
xmltest/source/libxml2/
xmltest/source/libxml2/CMakeLists.txt
xmltest/source/libxml2/lots of source files...

xmltest/source/CMakeLists.txt我把:

PROJECT(XMLTEST) 
CMAKE_MINIMUM_REQUIRED(VERSION 2.8) 

ADD_SUBDIRECTORY(libxml2) 

INCLUDE_DIRECTORIES(
    "${PROJECT_SOURCE_DIR}"/libxml2/include 
) 

而且xmltest/source/libxml2/CMakeLists.txthttp://epiar.net/trac/browser/Build/cmake/ThirdParty/LibXml2/CMakeLists.txt拍攝。除了修理LIBXML_SRC_FOLDER之外,我只剩下它。

xmltest/source/libxml2/的其餘部分是從http://xmlsoft.org/sources/libxml2-sources-2.7.6.tar.gz中提取的。

我用cmake-gui在xmltest/build/中構建項目,並且它工作正常。 MinGW將它編譯爲libxml2.a,我感到很自豪。

然後,我試圖添加一個可執行文件liblml2。

我已將此添加到主CMakeLists.txt

ADD_EXECUTABLE(xmltest 
    xmltest.c 
) 

TARGET_LINK_LIBRARIES(xmltest 
    xml2 
) 

創造xmltest.c

#include <libxml/parser.h> 

int main() 
{ 
    return 0; 
} 

CMake的仍然產生它沒有抱怨,但在編譯的時候,我得到

fatal error: libxml/parser.h: No such file or directory 

我已經在上嘗試了一些變化10行:

#include <libxml> 
#include <libxml2> 
#include <xml2> 
#include <libxml/parser.h> 
#include <libxml2/parser.h> 
#include <xml2/parser.h> 
#include "libxml2/include/libxml/parser.h" 

但它沒有幫助。有任何想法嗎?

回答

1

嘗試有刪除qoutes:

INCLUDE_DIRECTORIES(
    "${PROJECT_SOURCE_DIR}"/libxml2/include 
) 

還要確保,即include_directories()調用之前add_executable()調用來完成。

最後,在您的源代碼中使#include子句相對於xmltest/source/libxml2/include

編輯: 好吧,既然是正確的答案,讓我解釋CMake的行爲。

在CMake的,有字符串並有名單。列表實際上也是字符串,但它們之間用「;」分隔。 因此,"aaa;bbb;ccc"是一個字符串和一個列表,而"aaabbbccc"只是一個字符串(以及與單個元素的列表,但它是無關緊要的)。

如果你寫set(STR1 abc)set(STR2 "abc")你會得到相同的字符串。 但是,如果你寫set(STR1 a b c)你會得到一個3元素的列表。這與編寫set(STR1 "a;b;c")相同。

所以,你面臨你的問題,因爲"${PROJECT_SOURCE_DIR}"/libxml2/include實際上是一個有兩個目錄的列表。如果你將它傳遞到include_directories()你會得到這些標誌:-I${PROJECT_SOURCE_DIR} -I/libxml2/include這顯然不是你想要的。

+0

謝謝你的工作!我認爲這些報價搞砸了。如果$ {PROJECT_SOURCE_DIR}有空格,我將它們包括在內,但看起來它們必須圍繞整個路徑:「$ {PROJECT_SOURCE_DIR}/libxml2/include」,可能它們甚至不是必需的。 – Jeff 2012-02-16 19:37:20

+0

我已經用一些解釋更新了我的答案。 – arrowd 2012-02-17 08:51:26