CMake常用语句汇总
1.Cmake基础语法
1)基础路径
CMAKE_CURRENT_SOURCE_DIR
:这是当前处理的CMakeLists.txt所在的目录;
CMAKE_BINARY_DIR
:二进制目标文件目录,即生成exe的目录;
CMAKE_INSTALL_LIBDIR
:安装路径;
get_filename_component(DIR_ONE_ABOVE ../ ABSOLUTE)
:获取CMAKE_CURRENT_SOURCE_DIR上方的目录
2)QMake转换为CMake编译
2.Cmake其他语法
1)文件拷贝
a.add_custom_command
##使用时注意拷贝路径,拷贝路径不存在时会没有任何操作。
## 拷贝单个动态库文件
add_custom_command(TARGET ${PROJECT_NAME} POST_BUILD
COMMAND ${CMAKE_COMMAND} -E copy_if_different
"${CMAKE_CURRENT_SOURCE_DIR}/third_party/mydll.dll" #需要拷贝的文件
"${CMAKE_BINARY_DIR}") #拷贝目标目录
## 拷贝文件夹
add_custom_command( TARGET ${PROJECT_NAME} POST_BUILD
COMMAND ${CMAKE_COMMAND} -E copy_directory
"${CMAKE_CURRENT_SOURCE_DIR}/../ThirdParty/OpenCV/bin/win64" #需要拷贝的文件夹
"${CMAKE_BINARY_DIR}/Debug" )#拷贝目标目录
b.FILE-COPY
file(COPY ${CMAKE_CURRENT_SOURCE_DIR}/enum_desc.json DESTINATION ${CMAKE_BINARY_DIR}/install/bin/data FOLLOW_SYMLINK_CHAIN)
c.add_custom_target
add_custom_target(CopyRuntimeFiles ALL
VERBATIM
COMMAND_EXPAND_LISTS
COMMAND ${CMAKE_COMMAND} -E
make_directory "${PROJECT_BINARY_DIR}/$<$<CONFIG:Release>:Release>$<$<CONFIG:Debug>:Debug>/"
COMMAND ${CMAKE_COMMAND} -E
copy_if_different
"$<$<CONFIG:Release>:${Plugin_Runtime_Release_DLL_FILES}>"
"$<$<CONFIG:Debug>:${Plugin_Runtime_Debug_DLL_FILES}>"
"${PROJECT_BINARY_DIR}/$<$<CONFIG:Release>:Release>$<$<CONFIG:Debug>:Debug>/"
COMMAND ${CMAKE_COMMAND} -E
make_directory "${PROJECT_BINARY_DIR}/$<$<CONFIG:Release>:Release>$<$<CONFIG:Debug>:Debug>/Resources/icos/"
COMMAND ${CMAKE_COMMAND} -E
copy_if_different
"$<$<CONFIG:Release>:${Plugin_Runtime_Release_Resources_FILES}>"
"$<$<CONFIG:Debug>:${Plugin_Runtime_Debug_Resources_FILES}>"
"${PROJECT_BINARY_DIR}/$<$<CONFIG:Release>:Release>$<$<CONFIG:Debug>:Debug>/Resources/icos/"
COMMAND ${CMAKE_COMMAND} -E
make_directory "${PROJECT_BINARY_DIR}/$<$<CONFIG:Release>:Release>$<$<CONFIG:Debug>:Debug>/Plugins/org_test_plugins/"
)
2)生成动态库、静态库
关键语法: add_library
创建动态库:add_library(项目名称 SHARED 代码文件)
创建静态库:add_library(项目名称 STATIC 代码文件)
# 生成动态库
add_library(${PROJECT_NAME} SHARED ${SRC_LIST})
3)构建子项目
最顶级项目CMakeLists.txt构建如下,其他子项目按照正常编写。
# 顶级CMakeLists.txt
cmake_minimum_required (VERSION 3.5)
project(subprojects)
# Add sub directories
add_subdirectory(sublibrary1)
add_subdirectory(sublibrary2)
add_subdirectory(subbinary)
4)子项目依赖管理
libnode依赖core_cmake,在libnode的CMakeLists.txt中:
add_dependencies(libnode core_cmake)
:注意必须放在add_executable( IMPORTED)之后才起作用
#发现使用这个才有效
target_link_libraries(gui_debugger PRIVATE Qt${QT_VERSION_MAJOR}::Widgets libnode)
5)指定安装位置
a.设置路径,在project(XX)之后:
`SET(CMAKE_INSTALL_PREFIX <install path> CACHE PATH "Install path prefix" FORCE)`
b.设置RUNTIME_OUTPUT_DIRECTORY属性控制输出路径,在add_library/add_executable之后:
set_target_properties(${PROJECT_NAME} PROPERTIES RUNTIME_OUTPUT_DIRECTORY "abc/")
3.Cmake常见问题
1)乱码问题
解决方法:强制使用utf-8编码模式
if (CMAKE_CXX_COMPILER_ID MATCHES "MSVC")
# Force MSVC to use UTF-8 because that's what we use. Otherwise it uses
# the default of whatever Windows sets and causes encoding issues.
message(STATUS "You are using MSVC. Forceing to use UTF-8")
add_compile_options("$<$<C_COMPILER_ID:MSVC>:/utf-8>")
add_compile_options("$<$<CXX_COMPILER_ID:MSVC>:/utf-8>")
endif ()
2)配置CMake编译
CMakeTool:点击管理,选择cmake.exe,应用即可。