CMake引入第三方库的方法小结
  0eGysyk4Lrwg 2023年11月02日 106 0

(目录)


一、find_package引入

# CMakeLists.txt
cmake_minimum_required(VERSION 3.10)
project(FindLibInCmake)
add_executable(main.out src/main.cpp)

find_package(SDL2 REQUIRED)
# 指定库的版本
#find_package(Boost 1.54 REQUIRED COMPONENTS filesystem)
target_link_libraries(main.out PRIVATE SDL2::SDL2)

二、pkg-config引入

# CMakeLists.txt
cmake_minimum_required(VERSION 3.10)
project(FindLibInCmake)
add_executable(main.out src/main.cpp)

# PkgConfig模块是CMake自带的
find_package(PkgConfig REQUIRED)
# IMPORTED_TARGET:将pkg-config找到的库自动导入为TARGET
pkg_check_moduLes(SDL2 sdl2 REQUIRED IMPORTED_TARGET)
target_link_libraries(main.out PRIVATE PkgConfig::SDL2)

其他用法

find_package(PkgConfig REQUIRED QUIET)

pkg_search_module(
  ZeroMQ
  REQUIRED
      libzeromq libzmq lib0mq
  IMPORTED_TARGET
  )

if(TARGET PkgConfig::ZeroMQ)
    message(STATUS "Found ZeroMQ")
endif()

add_executable(hwserver hwserver.c)
target_link_libraries(hwserver PkgConfig::ZeroMQ)
add_executable(hwclient hwclient.c)
target_link_libraries(hwclient PkgConfig::ZeroMQ)

当找到 pkg-config 时,CMake需要提供两个函数,来封装这个程序提供的功能:

  • pkg_check_modules,查找传递列表中的所有模块(库和/或程序)
  • pkg_search_module,要在传递的列表中找到第一个工作模块

三、git工程引入

# CMakeLists.txt
cmake_minimum_required(VERSION 3.10)
project(FindLibInCmake)
add_executable(main.out src/main.cpp)

$[[
    git init
    git submodule add https://github.com/libsdl-org/SDL.git 3rdpart/SDL
]]

# 构建CMake子项目
add_subdirectory(3rdpart/SDL)
target_link_libraries(main.out PRIVATE SDL2::SDL2)

四、头文件+库文件(.h + lib)引入

# CMakeLists.txt
cmake_minimum_required(VERSION 3.10)
project(FindLibInCmake)
add_executable(main.out src/main.cpp)

include(cmake/FindSDL2.cmake)
target_link_libraries(main.out PRIVATE SDL2::SDL2)

==============================================================

# cmake/FindSDL2.cmake
find_path(SDL2_HEADER_PATH SDL.h PATHS 3rdlib/SDL2/include/SDL2 REQUIRED)
find_path(SDL2_LIB_PATH libSDL2.a PATHS 3rdlib/SDL2/lib REQUIRED)

# 可以在cmake-gui及ccmake中配置
#set(SDL2_HEADER_PATH "${CMAKE_SOURCE_DIR}/3rdlib/SDL2/include/SDL2" CACHE STRING "SDL2 include Path")
#set(SDL2_LIB_PATH "${CMAKE_SOURCE_DIR}/3rdlib/SDL2/lib" CACHE STRING "SDL2 lib Path")

message(STATUS "include dir: ${SDL2_HEADER_PATH}")
message(STATUS "lib dir: ${SDL2_LIB_PATH}")

# INTERFACE:外部库,无需编译;IMPORTED:将编译好的库导入成TARGET
add_library(SDL2::SDL2 INTERFACE IMPORTED)

set_target_properties(
    SDL2::SDL2
    PROPERTIES
        INTERFACE_INCLUDE_DIRECTORIES "${SDL2_HEADER_PATH}"
        INTERFACE_LINK_LIBRARIES "-L${SDL2_LIB_PATH} -lmingw32 -lSDL2main -lSDL2 -mwindows" # -mwindows指出平台依赖
        IMPORTED_LINK_INTERFACE_LANGUAGES "C" # 因为导入的是C库
)

五、编译命令

#cmake -S . -B build -G"MinGW Makefiles" -DSDL2_HEADER_PATH=/usr/local/include
cmake -S . -B build -DCMAKE_BUILD_TYPE=Debug
cmake --build build -j2
【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年11月08日 0

暂无评论

0eGysyk4Lrwg