CMake не может связать libxml2 в CLion - PullRequest
0 голосов
/ 15 мая 2018

tl; др. Добавить set(CMAKE_CXX_STANDARD_LIBRARIES "-lxml2" ) к CMakeLists.txt (больше информации ниже).


Я хочу запустить очень простое приложение в CLion. Это приложение использует libxml2.

Я использую CLion 2018.1.2 в Ubuntu 18.04 LTS, libxml2-dev правильно установлен.

Мой проект компилируется с:

g++ -I /usr/include/libxml2 xmlTest.cpp -o xmlTest.exe -lxml2

он не компилируется в CLion, хотя, используя это CMakeLists.txt:

cmake_minimum_required(VERSION 3.10)
project(xmlTest)

set(CMAKE_CXX_STANDARD 11)
set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -I/usr/include/libxml2 -lxml2 -lz -lm")

include_directories( /usr/local/include/libxml2 )

add_executable (xmlTest.exe xmlTest.cpp)

компилятор выкидывает меня:

/home/xxxx/.local/share/JetBrains/Toolbox/apps/CLion/ch-0/181.4668.70/bin/cmake/bin/cmake --build /home/xxxx/src/cmake-build-debug --target xmlTest.exe -- -I /usr/include/libxml2 -lxml2
Scanning dependencies of target xmlTest.exe
[ 50%] Building CXX object CMakeFiles/xmlTest.exe.dir/xmlTest.cpp.o
[100%] Linking CXX executable xmlTest.exe
CMakeFiles/xmlTest.exe.dir/xmlTest.cpp.o: In function `main':
/home/xxxx/src/xmlTest.cpp:10: undefined reference to `xmlReadFile'
/home/xxxx/src/xmlTest.cpp:17: undefined reference to `xmlDocGetRootElement'
/home/xxxx/src/xmlTest.cpp:21: undefined reference to `xmlFreeDoc'
/home/xxxx/src/xmlTest.cpp:25: undefined reference to `xmlStrcmp'
/home/xxxx/src/xmlTest.cpp:27: undefined reference to `xmlFreeDoc'

мое заявление (xmlTest.cpp):

#include <stdlib.h>
#include <stdio.h>
#include <libxml/parser.h>
#include <libxml/tree.h>

int main(int argc, char const *argv[]) {
  xmlDocPtr doc;
  xmlNodePtr cur;

  doc = xmlReadFile(argv[1], NULL, 0);

  if (doc == NULL ) {
    fprintf(stderr,"Document not parsed successfully. \n");
    return 1;
  }

  cur = xmlDocGetRootElement(doc);

  if (cur == NULL) {
    fprintf(stderr,"empty document\n");
    xmlFreeDoc(doc);
    return 1;
  }

  if (xmlStrcmp(cur->name, (const xmlChar *) "users")) {
    fprintf(stderr,"document of the wrong type, root node != story");
    xmlFreeDoc(doc);
    return 1;
  }

  return 0;
}

после долгих часов работы с libxml2 и CMake, безуспешно, я открыт для любой идеи, что делать, чтобы сказать, что CMake libxml2 действительно существует ...


Обновление № 1:

благодаря предложению @vre я обновил CMakeLists.txt файл:

cmake_minimum_required(VERSION 3.10)
project(xmlTest)

set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -I/usr/include/libxml2 -lxml2 -lz -lm")
set(CMAKE_CXX "/usr/local/include/libxml2")
find_library(libxml2 libxml2)
link_directories(/usr/local/include/libxml2)
add_compile_options("-I/usr/include/libxml2 -lxml2 -lz -lm")
find_package(LibXml2 REQUIRED)
add_executable (xmlTest.exe xmlTest.cpp)
target_compile_definitions(xmlTest.exe PUBLIC ${LibXml2_DEFINITIONS})
target_include_directories(xmlTest.exe PUBLIC ${LibXml2_INCLUDE_DIRS})
target_link_libraries(xmlTest.exe ${LibXml2_LIBRARIES})

Это не изменило и не устранило ошибку.

Обновление № 2 (решение):

это как строить проекты с libxml2 в CLion:

cmake_minimum_required(VERSION 3.10)
project(xmlTest)

set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -I/usr/include/libxml2")
set(CMAKE_CXX_STANDARD_LIBRARIES "-lxml2" )

add_executable (xmlTest.exe xmlTest.cpp)

Моя проблема заключалась в том, что в моем CMAKE_CXX_FLAGS был неправильный порядок аргументов. Эта статья указывает на это. Использование set(CMAKE_CXX_STANDARD_LIBRARIES "-lxml2" ) было ключом ( см. )

Надеюсь, это поможет некоторым будущим путешественникам во времени:

1 Ответ

0 голосов
/ 15 мая 2018

Решение, которое вы придумали, работает, но цель CMake состоит в том, чтобы предоставить средства для выражения независимой от платформы, компилятора и средства построения описания проектов. Вся магия происходит в модуле FindLibXml2.cmake. И огромное количество модулей поставляется готовыми к использованию с вашей CMake установкой. Смотрите каталог модулей в /usr/share/cmake-3.10/Modules на Ubuntu 18.04.

Если вы переформулируете свой CMakeLists.txt следующим образом:

cmake_minimum_required(VERSION 3.10)

project(xmlTest)

set(CMAKE_CXX_STANDARD 11)
if ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU")
  set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall")
elseif(MSVC)
  # add options for Visual C/C++ Compiler here
  set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /W4")
endif()    

find_package(LibXml2 REQUIRED)

add_executable(xmlTest.exe xmlTest.cpp)

target_compile_definitions(xmlTest.exe PUBLIC ${LIBXML2_DEFINITIONS})
target_include_directories(xmlTest.exe PUBLIC ${LIBXML2_INCLUDE_DIRS})
target_link_libraries(xmlTest.exe ${LIBXML2_LIBRARIES})

Вы можете работать на широком спектре платформ и комбинаций компиляторов и IDE. Это было проверено на Ubuntu 18.04 с GCC 7.3 и Windows 10 с MSVC 15. Вам нужно еще несколько шагов для сборки в Windows (то есть установка и настройка libxml2 и всех его зависимостей). И это должно работать с CLion тоже из коробки.

...