我的Cmake libxml2项目出了什么问题?

时间:2012-02-16 04:18:04

标签: xml compilation cmake libxml2

这是我第一次使用C / C ++以及CMake,所以可能会出现很多问题。

我使用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.txt取自http://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,我很自豪。

然后我尝试添加一个可执行文件#include libxml2。

我将其添加到主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

我在#include行尝试了一些变体:

#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 个答案:

答案 0 :(得分: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这显然不是你所希望的。