这是我第一次使用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"
但它没有帮助。有什么想法吗?
答案 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
这显然不是你所希望的。