我正在使用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
有什么问题?
答案 0 :(得分:1)
计算机上安装的库有一项重要工作。完成<lib_name>_INCLUDE_DIR
后,<lib_name>_LIBRARIES
和find_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)
here有libxml2
的32位和64位版本。
您可以将它们放在PATH
-或C:\Windows
目录下。
答案 3 :(得分:0)
使用现代 CMake(3.2 版或更高版本),它变得更容易:
搜索图书馆。 CMake 有一个 according find module,因此可以归结为
find_package(LibXml2 REQUIRED)
然后您可以将库链接到您的目标 foo
target_link_libraries(foo PUBLIC LibXml2::LibXml2)
就是这样!无需摆弄头文件和库,全部自动完成。
如果您尚未安装该库,您可能希望将 LibXml2_DIR
设置为 LibXml2 所在的位置,即将 -DLibXml2_DIR=C:\software\libxml2
传递给您的 CMake 调用。这将有助于 CMake 找到 LibXml2。