如何在CMake中使用libxml2?

时间:2015-10-09 21:45:18

标签: cmake libxml2

我正在使用CLion编辑器(使用CMake)进行我的C项目, 我从未使用过外部库, 我的问题是如何将外部lib(例如libxml2)链接到我的项目? 我已经看到了一些与此类似的问题,但没有一个对我有用。 我的项目是在Windows上编译的,我有libxml .dll,include和.lib文件(Windows的二进制文件)。

编辑:建议答案后我的CMakeLists.txt文件:

cmake_minimum_required(VERSION 3.2)
project(time_table)

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")

set(SOURCE_FILES
    course.c
    course.h
    day.h
    defines.h
    find_tables.c
    find_tables.h
    item.h
    parse_info.c
    parse_info.h
    table.c
    table.h
    time_table.c grades.c grades.h)

link_libraries(C:/Users/Gal/Desktop/time_table/libxml2-2.7.8.win32/lib)
add_executable(time_table ${SOURCE_FILES})
target_link_libraries(time_table libxml2)

这就是我得到的:

"C:\Program Files (x86)\JetBrains\CLion 1.1.1\bin\cmake\bin\cmake.exe" --build C:\Users\Gal\.clion11\system\cmake\generated\2eda76ff\2eda76ff\Debug --target time_table -- -j 8
[ 14%] Linking C executable time_table.exe
c:/mingw/bin/../lib/gcc/mingw32/4.8.1/../../../../mingw32/bin/ld.exe: cannot find -llibxml2
collect2.exe: error: ld returned 1 exit status
mingw32-make.exe[3]: *** [time_table.exe] Error 1
CMakeFiles\time_table.dir\build.make:225: recipe for target 'time_table.exe' failed
CMakeFiles\Makefile2:66: recipe for target 'CMakeFiles/time_table.dir/all' failed
mingw32-make.exe[2]: *** [CMakeFiles/time_table.dir/all] Error 2
CMakeFiles\Makefile2:78: recipe for target 'CMakeFiles/time_table.dir/rule' failed
mingw32-make.exe[1]: *** [CMakeFiles/time_table.dir/rule] Error 2

有什么问题?

4 个答案:

答案 0 :(得分:1)

计算机上安装的库有一项重要工作。完成<lib_name>_INCLUDE_DIR后,<lib_name>_LIBRARIESfind_package就会出现。这对我有用。

find_package(LibXml2 REQUIRED)
include_directories(${CMAKE_CURRENT_SOURCE_DIR}/<my_stuff> ${LIBXML2_INCLUDE_DIR})
add_executable(<my_exe> <my_source_files>)
target_link_libraries(<my_exe> ${LIBXML2_LIBRARIES})

----只是出于好奇的注意事项----

如果您需要构建(1)您的计算的(静态)库(可能可重用),以及(2)使用该库和LIBXML2的可执行文件,请执行此操作。

find_package(LibXml2 REQUIRED)

# add a calculation library: file "lib<mycalc>.a"
include_directories(${CMAKE_CURRENT_SOURCE_DIR}/<your header files folder> ${LIBXML2_INCLUDE_DIR})
add_library(<mycalc> STATIC ${CMAKE_CURRENT_SOURCE_DIR}/<your src files folder>)
target_link_libraries(<mycalc> ${LIBXML2_LIBRARIES}) 

# add the executable: file <my_exe>
include_directories(${CMAKE_CURRENT_SOURCE_DIR}/<your header files folder> ${LIBXML2_INCLUDE_DIR})
add_executable(<my_exe> <your exe src files>)
target_link_libraries(<my_exe> <mycalc> ${LIBXML2_LIBRARIES}) 

答案 1 :(得分:0)

假设库的完整路径(.lib)可以表示为

<library_dir>/<library_name>.lib

对于使用此库的 compile 可执行文件,您需要:

<强>的CMakeLists.txt

link_libraries(<library_dir>)

add_excutable(<my_exe> ..)
target_link_libraries(<my_exe> <library_name>)

对于使用运行)已编译的可执行文件,您需要<library_name>.dll位于PATH环境中列出的目录之一下变量,或与可执行文件在同一目录中。

答案 2 :(得分:0)

herelibxml2的32位和64位版本。

您可以将它们放在PATH-或C:\Windows目录下。

答案 3 :(得分:0)

使用现代 CMake(3.2 版或更高版本),它变得更容易:

  1. 搜索图书馆。 CMake 有一个 according find module,因此可以归结为

    find_package(LibXml2 REQUIRED)
    
  2. 然后您可以将库链接到您的目标 foo

    target_link_libraries(foo PUBLIC LibXml2::LibXml2)
    

就是这样!无需摆弄头文件和库,全部自动完成。

如果您尚未安装该库,您可能希望将 LibXml2_DIR 设置为 LibXml2 所在的位置,即将 -DLibXml2_DIR=C:\software\libxml2 传递给您的 CMake 调用。这将有助于 CMake 找到 LibXml2。