创建库
1 2 3 |
add_library(${PROJECT_NAME} SHARED ${SRC_LIST}) add_library(${PROJECT_NAME} STATIC ${SRC_LIST}) |
修改创建库的默认行为
1 2 3 4 |
set(BUILD_SHARED_LIBS ON) // 创建动态库 add_library(${PROJECT_NAME} ${SRC_LIST}) |
创建可执行文件
1 |
add_executable(${PROJECT_NAME} main.cpp) |
链接库
1 2 3 4 5 6 7 |
add_library(${PROJECT_NAME} SHARED ${SRC_LIST} ) target_link_libraries(${PROJECT_NAME} test.a) // 另一种方式 add_library(3RD_LOG OBJECT ${CMAKE_SOURCE_DIR}/../3rd/log/Logger.cpp) target_link_libraries(${PROJECT_NAME} 3RD_LOG) |
1 2 3 4 5 6 7 |
add_library( FBSLib SHARED IMPORTED ) set_target_properties( libOTe PROPERTIES IMPORTED_LOCATION ${PROJECT_SOURCE_DIR}/lib/libFBSLib.a ) set(PSI_SOURCES PSI/src/PSI.cpp) add_executable(PSI PSI/main.cpp ${PSI_SOURCES}) target_include_directories(PSI PUBLIC ${PROJECT_SOURCE_DIR}/include/) target_link_libraries(PSI PUBLIC FBSLib) |
安装库
1 2 3 |
set(CMAKE_INSTALL_PREFIX ${PROJECT_SOURCE_DIR}/install) install(TARGETS hello LIBRARY DESTINATION lib) install(FILES ${PROJECT_SOURCE_DIR}/libhello/hello.h DESTINATION include) |
函数与调用
1 2 3 4 5 |
function(testFunc) message("hello") endfunction() testFunc() |
修改输出名
1 |
set_target_properties(${PROJECT_NAME} PROPERTIES OUTPUT_NAME "EnServiceColl") |
去掉前缀lib
1 |
set_target_properties(${PROJECT_NAME} PROPERTIES PREFIX "") |
macos下混合编译
- 把下面内容封成一个函数,然后在add_library下面一行调用,函数可以在其他target_link_libraries的上面或是下面
- 也可以在target_link_libraries一行内,写在后面
1 2 3 4 5 6 |
set(macos_cxx_link_libraries "-framework Foundation" "-framework CoreFoundation" "-framework CoreWLAN" ) target_link_libraries(${PROJECT_NAME} ${macos_cxx_link_libraries}) |
判断Debug还是Release
1 2 |
if (CMAKE_BUILD_TYPE STREQUAL "Debug") endif() |
添加DEBUG宏定义
1 2 3 |
if (${CMAKE_BUILD_TYPE} STREQUAL "Debug") add_definitions(-DDEBUG) endif() |
自定义构建规则
- cp的参数如下:
-r
:递归复制目录。这意味着该命令还将复制目录中的所有文件和子目录-a
:将源文件的所有属性复制到目标文件。这包括文件权限、所有权和修改时间-i
:在覆盖现有文件之前提示确认-v
:打印复制操作的详细输出
1 |
cp [options] source_file1 source_file2 ... destination |
1 2 3 4 5 6 7 |
# 构建后,拷贝 # 构建前(PRE_BUILD) add_custom_command(TARGET ${PROJECT_NAME} POST_BUILD COMMAND cp ${CMAKE_SOURCE_DIR}/cmake-build-debug/EnSoftwareColl.dylib ${CMAKE_SOURCE_DIR}/testPro/cmake-build-debug/) |
变量作用域相关
- 将函数作用域内定义的变量设置为外层可见
1 2 3 4 5 6 |
function(lifwang) set(SPDLOG_VERSION_MAJOR ${ver_major} PARENT_SCOPE) set(SPDLOG_VERSION_MINOR ${ver_minor} PARENT_SCOPE) set(SPDLOG_VERSION_PATCH ${ver_patch} PARENT_SCOPE) set(SPDLOG_VERSION "\${ver_major}.\${ver_minor}.\${ver_patch}" PARENT_SCOPE) endfunction() |
在文件夹里匹配文件并存入变量
- 在指定路径下匹配头文件,将所有结果存入变量SPDLOG_TOP_HEADERS
1 |
file(GLOB SPDLOG_TOP_HEADERS "\${SPDLOG_HEADERS_DIR}/spdlog/*.h") |
- 在指定路径以及其子路径下,匹配头文件,将所有结果存入变量SPDLOG_TOP_HEADERS
1 |
file(GLOB_RECURSE SPDLOG_TOP_HEADERS "\${SPDLOG_HEADERS_DIR}/spdlog/*.h") |
在匹配到的文件列表里剔除个别文件
- 这里需要注意的是,后面的目标cpp需要时全路径,否则识别不到
1 2 |
file(GLOB SPDLOG_TOP_HEADERS "\${SPDLOG_HEADERS_DIR}/spdlog/*.h") list(REMOVE_ITEM SRC_TOP_LIST "${CMAKE_SOURCE_DIR}/dllmain.cpp") |
在函数里导出列表,让外部可见
1 2 3 4 5 |
function(set_common_var) set(COMMON_INCLUDE "${CMAKE_SOURCE_DIR}/../../common" "${CMAKE_SOURCE_DIR}/../../common/mac_common") set(COMMON_INCLUDE ${COMMON_INCLUDE} PARENT_SCOPE) endfunction() |
在函数里面修改列表,让改动外部可见
1 2 3 4 5 6 7 8 9 10 11 12 |
function(set_lib_list) set(LIB_LIST PARENT_SCOPE) if (DEFINED BOOST_LIB_FILESYSTEM) list(APPEND LIB_LIST ${BOOST_LIB_FILESYSTEM}) set(LIB_LIST ${LIB_LIST} PARENT_SCOPE) endif() if (DEFINED BOOST_LIB_THREAD) list(APPEND LIB_LIST ${BOOST_LIB_THREAD}) set(LIB_LIST ${LIB_LIST} PARENT_SCOPE) endif() endfunction() |
参数为列表的函数
- 使用参数的时候,需要把变了引号括起来,否则识别有问题
1 2 3 |
function(set_macos_compile_about list) target_link_libraries(${PROJECT_NAME} "${list}") endfunction() |
- 同样,调用的时候也需要括起来,否则有问题
1 2 3 4 5 6 7 8 |
set(mac_cxx_link_list "-framework Foundation" "-framework CoreFoundation" "-framework OpenDirectory" ) # 调用 set_macos_compile_about("${mac_cxx_link_list}") |
本文为原创文章,版权归Aet所有,欢迎分享本文,转载请保留出处!
你可能也喜欢
- ♥ CLion:配置C++下Nasm开发环境(debian)08/06
- ♥ Macos开发问题:aarch64架构宏不识别06/25
- ♥ Why CMake?10/02
- ♥ Makefile记述一08/15
- ♥ Cmake 构建命令10/02
- ♥ CMake教程一06/20