Что не так с моим проектом Cmake libxml2? - PullRequest
1 голос
/ 16 февраля 2012

Я впервые использую C / C ++, а также CMake, так что может быть много чего не так.

Я создал минимальный проект с использованием CMake и libxml2. Это выглядит так:

xmltest/ <br>xmltest/source/ <br>xmltest/source/<b>CMakeLists.txt</b> <br>xmltest/source/<b>testxml.c</b> <br>xmltest/source/libxml2/ <br>xmltest/source/libxml2/<b>CMakeLists.txt</b> <br>xmltest/source/libxml2/<b>lots of source files...</b> <br>

В 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 ing 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 Ответ

1 голос
/ 16 февраля 2012

Попробуй убрать там qoutes:

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

Также убедитесь, что include_directories() вызов выполняется до add_executable() вызова.

Наконец, сделайте предложение #include в вашем источнике относительно xmltest/source/libxml2/include.

EDIT: Хорошо, так как это правильный ответ, позвольте мне объяснить поведение 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, что явно не то, что вы хотели.

...