在VS中,为项目导入第三方库通常包含以下三个步骤:
- 添加头文件路径 (Additional Include Directories)
- 添加库文件路径 (Additional Library Directories)
- 链接库文件 (Link Library Dependencies)
在cmake中,均有对应的语句。
添加头文件路径 (Additional Include Directories):
include_directories(<h_files_path>) # 括号中参数是头文件所在目录,通常名为include
添加库文件路径 (Additional Library Directories):
link_directories(<lib_files_path>) # 添加库文件所在目录,通常名为lib或libs
链接库文件 (Link Library Dependencies):
target_link_libraries(<project_name> <lib_file_1> <lib_file_2> ...) # 第一个参数为项目名,后面的参数为库文件名(不加.lib后缀)
下面以OpenGL的glfw与glew库为例:
cmake_minimum_required(VERSION 3.20)
project(OpenGLTest) # 项目名
set(CMAKE_CXX_STANDARD 17) # C++ 17
# 设置 GLFW 头文件与库文件的路径
set(GLFW_INCLUDE_DIR "E:/cpp_libraries/glfw-3.3.8.bin.WIN64/include/")
set(GLFW_LIB_DIR "E:/cpp_libraries/glfw-3.3.8.bin.WIN64/lib-vc2022/")
# 设置 GLEW 头文件与库文件的路径
set(GLEW_INCLUDE_DIR "E:/cpp_libraries/glew-2.2.0/include/")
set(GLEW_LIB_DIR "E:/cpp_libraries/glew-2.2.0/lib/Release/x64/")
# 添加GLFW头文件搜索路径
include_directories(${GLFW_INCLUDE_DIR})
# 添加GLFW库文件搜索路径
link_directories(${GLFW_LIB_DIR})
# 添加GLEW头文件搜索路径
include_directories(${GLEW_INCLUDE_DIR})
# 添加GLEW库文件搜索路径
link_directories(${GLEW_LIB_DIR})
# 添加将生成可执行文件的项目源(头)文件
add_executable(OpenGLTest main.cpp)
# 链接 GLFW 与 GLEW 库文件
target_link_libraries(OpenGLTest glfw3 opengl32)
target_link_libraries(OpenGLTest glew32s)
# 添加一个宏定义,相当于vs中的预处理器定义
target_compile_definitions(OpenGLTest PRIVATE GLEW_STATIC)
其中 opengl32.lib文件是系统自带的,在C:\Program Files (x86)\Windows Kits下,该路径默认已在环境变量中,因此该文件可被cmake找到。
还需注意target_link_libraries得放在add_executable后面。
对于更大型的库,则可以使用 find_package 语句。以下以OpenCV库为例:
先让cmake找到OpenCV。cmake会在CMAKE_PREFIX_PATH与系统环境变量的Path下查找,因此若已加入环境变量,也可不用再 set(CMAKE_PREFIX_PATH ...)
set(CMAKE_PREFIX_PATH "E:/OpenCV/opencv/build") # 设置opencv路径
find_package(OpenCV REQUIRED)
输出OpenCV相关参数
get_cmake_property(_variableNames VARIABLES)
foreach(_variableName ${_variableNames})
if(_variableName MATCHES "^OpenCV.*") # 正则表达式,匹配所有以OpenCV开头的变量
message(STATUS "${_variableName}: ${${_variableName}}")
endif()
endforeach()
这段代码仅用于将OpenCV相关参数 输出到控制台,在正式的CMakeLists.txt中应该被删掉。其输出为:
[cmake] -- OpenCV_ARCH: x64
[cmake] -- OpenCV_CONFIG: E:/OpenCV/opencv/build/OpenCVConfig.cmake
[cmake] -- OpenCV_CONFIG_PATH: E:/OpenCV/opencv/build/x64/vc16/lib
[cmake] -- OpenCV_CONSIDERED_CONFIGS: E:/OpenCV/opencv/build/OpenCVConfig.cmake
[cmake] -- OpenCV_CONSIDERED_VERSIONS: 4.8.0
[cmake] -- OpenCV_DIR: E:/OpenCV/opencv/build
[cmake] -- OpenCV_FOUND: 1
[cmake] -- OpenCV_INCLUDE_DIRS: E:/OpenCV/opencv/build/include
[cmake] -- OpenCV_INSTALL_PATH: E:/OpenCV/opencv/build
[cmake] -- OpenCV_LANGUAGES: C;CXX;RC
[cmake] -- OpenCV_LIBRARIES: opencv_calib3d;opencv_core;opencv_dnn;opencv_features2d;opencv_flann;opencv_gapi;opencv_highgui;opencv_imgcodecs;opencv_imgproc;opencv_ml;opencv_objdetect;opencv_photo;opencv_stitching;opencv_video;opencv_videoio;opencv_world
[cmake] -- OpenCV_LIBS: opencv_calib3d;opencv_core;opencv_dnn;opencv_features2d;opencv_flann;opencv_gapi;opencv_highgui;opencv_imgcodecs;opencv_imgproc;opencv_ml;opencv_objdetect;opencv_photo;opencv_stitching;opencv_video;opencv_videoio;opencv_world
[cmake] -- OpenCV_LIB_COMPONENTS: opencv_calib3d;opencv_core;opencv_dnn;opencv_features2d;opencv_flann;opencv_gapi;opencv_highgui;opencv_imgcodecs;opencv_imgproc;opencv_ml;opencv_objdetect;opencv_photo;opencv_stitching;opencv_video;opencv_videoio;opencv_world
[cmake] -- OpenCV_LIB_PATH: E:/OpenCV/opencv/build/x64/vc16/lib
[cmake] -- OpenCV_RUNTIME: vc16
[cmake] -- OpenCV_SHARED: ON
[cmake] -- OpenCV_STATIC: OFF
[cmake] -- OpenCV_USE_MANGLED_PATHS: FALSE
[cmake] -- OpenCV_VERSION: 4.8.0
[cmake] -- OpenCV_VERSION_COUNT: 3
[cmake] -- OpenCV_VERSION_MAJOR: 4
[cmake] -- OpenCV_VERSION_MINOR: 8
[cmake] -- OpenCV_VERSION_PATCH: 0
[cmake] -- OpenCV_VERSION_STATUS:
[cmake] -- OpenCV_VERSION_TWEAK: 0
[cmake] -- OpenCV_WORLD_COMPONENTS: opencv_calib3d;opencv_core;opencv_dnn;opencv_features2d;opencv_flann;opencv_gapi;opencv_highgui;opencv_imgcodecs;opencv_imgproc;opencv_ml;opencv_objdetect;opencv_photo;opencv_stitching;opencv_video;opencv_videoio
[cmake] -- OpenCV_opencv_calib3d_FOUND: TRUE
[cmake] -- OpenCV_opencv_core_FOUND: TRUE
[cmake] -- OpenCV_opencv_dnn_FOUND: TRUE
[cmake] -- OpenCV_opencv_features2d_FOUND: TRUE
[cmake] -- OpenCV_opencv_flann_FOUND: TRUE
[cmake] -- OpenCV_opencv_gapi_FOUND: TRUE
[cmake] -- OpenCV_opencv_highgui_FOUND: TRUE
[cmake] -- OpenCV_opencv_imgcodecs_FOUND: TRUE
[cmake] -- OpenCV_opencv_imgproc_FOUND: TRUE
[cmake] -- OpenCV_opencv_ml_FOUND: TRUE
[cmake] -- OpenCV_opencv_objdetect_FOUND: TRUE
[cmake] -- OpenCV_opencv_photo_FOUND: TRUE
[cmake] -- OpenCV_opencv_stitching_FOUND: TRUE
[cmake] -- OpenCV_opencv_video_FOUND: TRUE
[cmake] -- OpenCV_opencv_videoio_FOUND: TRUE
[cmake] -- OpenCV_opencv_world_FOUND: TRUE
因此可根据其添加头文件路径,及链接库文件。
include_directories(${OpenCV_INCLUDE_DIRS})
link_directories(${OpenCV_LIB_PATH})
target_link_libraries(${PROJECT_NAME} ${OpenCV_LIBS})
完整的CMakeLists.txt:
cmake_minimum_required(VERSION 3.20)
project(OpenCVTest)
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_PREFIX_PATH "E:/OpenCV/opencv/build") # 设置opencv路径
find_package(OpenCV REQUIRED)
# get_cmake_property(_variableNames VARIABLES)
# foreach(_variableName ${_variableNames})
# if(_variableName MATCHES "^OpenCV.*")
# message(STATUS "${_variableName}: ${${_variableName}}")
# endif()
# endforeach()
include_directories(${OpenCV_INCLUDE_DIRS}) # 添加头文件路径
link_directories(${OpenCV_LIB_PATH}) # 添加库文件路径
add_executable(OpenCVTest main.cpp)
target_link_libraries(OpenCVTest ${OpenCV_LIBS}) # 链接库文件
注意:
- msvc编译器与mingw编译器所链接的库文件可能无法通用,注意链接的库文件目录的名称。
- cmake仅用于编译。可能运行时报错称缺少dll文件(一般在bin文件夹下),可以选择将该dll复制到运行可执行文件时所处的目录下,或将dll文件所处文件夹加入系统环境变量。