(目录)
一、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