2个CMakeLists.txt导入第三方库的通用模板

在VS中,为项目导入第三方库通常包含以下三个步骤: 

  1.   添加头文件路径 (Additional Include Directories)
  2.   添加库文件路径   (Additional Library Directories)
  3.   链接库文件 (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})  # 链接库文件

注意:

  1.  msvc编译器与mingw编译器所链接的库文件可能无法通用,注意链接的库文件目录的名称。
  2.  cmake仅用于编译。可能运行时报错称缺少dll文件(一般在bin文件夹下),可以选择将该dll复制到运行可执行文件时所处的目录下,或将dll文件所处文件夹加入系统环境变量。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值