在构建的程序版本中,一共有 debug release minisize relwithDebugInfo四种,其中我们主要使用到就是 debug release 两种,这两种存在着一定的不同,debug 版本 用于调试,有调试信息,方便调试,体积也更大;release版本 用于发布,体积更小;
在使用cmake 针对 debug release 配置时也存在一定的不同,本节,我们就来学习 cmake 构建目标版本 debug release 特性的设置。
本专栏的实践代码全部放在 github 上,欢迎 star !!!
如有问题,欢迎留言、或加群【392784757】交流
CMakeLists.txt 分段给出
目标结构
src/
|—slib.cpp
|—dlib.cpp
|—main.cpp
bin/
|—debug
|—|—main
|—|—dlib.dll
|—release
|—|— …
lib/
|—debug
|—|—slib.lib
|—|—dlib.lib
|—|—dlib.so
|—|—slib.a
|–release
|—|— …
CMAKE_BUILD_TYPE
linux/ mac 控制方法 vs项目不可用, linux 默认为空, 既不是debug也不是release,设置方式有两种
- set()
- cmake -D CMAKE_BUILD_TYPE=Release
windows vs/nmake,vs 在生成阶段无法控制配置 自动生成4种 编译器选择,构建时指定
cmake --build win --config Release
cmake_minimum_required(VERSION 3.22)
project(cmake_debug_release)
if(NOT CMAKE_BUILD_TYPE)
set(CMAKE_BUILD_TYPE Debug)
endif()
message("CMAKE_BUILD_TYPE = ${CMAKE_BUILD_TYPE}")
静态库构建与属性设置
file(WRITE src/slib.cpp [=[
void slib(){}
]=])
add_library(slib STATIC src/slib.cpp)
#配置输出路径
set(OUT_LIB_PATH ${CMAKE_SOURCE_DIR}/lib)
set(OUT_EXE_PATH ${CMAKE_SOURCE_DIR}/bin)
set_target_properties(slib PROPERTIES
#
ARCHIVE_OUTPUT_DIRECTORY ${OUT_LIB_PATH}
ARCHIVE_OUTPUT_DIRECTORY_DEBUG ${OUT_LIB_PATH}/debug
ARCHIVE_OUTPUT_DIRECTORY_RELEASE ${OUT_LIB_PATH}/release
)
这里我们定义了两个输出的路径,提供给所有的构建目标使用
- Lib输出路径 set(OUT_LIB_PATH ${CMAKE_SOURCE_DIR}/lib)
- 可执行文件输出路径 set(OUT_EXE_PATH ${CMAKE_SOURCE_DIR}/bin)
动态库构建
file(WRITE include/dlib.h [=[
#ifndef _WIN32 // linux mac unix android
#define CPP_API
#else // windows
#ifdef dlib_EXPORTS
#define CPP_API __declspec(dllexport) // 库项目调用
#else
#define CPP_API __declspec(dllimport) // 调用库项目调用
#endif
#endif
CPP_API void dlib();
]=])
file(WRITE src/dlib.cpp [=[
#include "dlib.h"
void dlib(){}
]=])
add_library(dlib SHARED src/dlib.cpp include/dlib.h)
target_include_directories(dlib PUBLIC include)
动态库的设置注意,为保证在windows下兼容性,要设置宏,将动态库的符号导出
动态库属性设置
set_target_properties(dlib PROPERTIES
# windows lib 文件的输出
ARCHIVE_OUTPUT_DIRECTORY ${OUT_LIB_PATH}
ARCHIVE_OUTPUT_DIRECTORY_DEBUG ${OUT_LIB_PATH}/debug
ARCHIVE_OUTPUT_DIRECTORY_RELEASE ${OUT_LIB_PATH}/release
# windows dll文件输出路径
RUNTIME_OUTPUT_DIRECTORY ${OUT_EXE_PATH}
RUNTIME_OUTPUT_DIRECTORY_DEBUG ${OUT_EXE_PATH}/debug
RUNTIME_OUTPUT_DIRECTORY_RELEASE ${OUT_EXE_PATH}/release
# windows pdb 文件
PDB_OUTPUT_DIRECTORY ${OUT_LIB_PATH}/pdb
PDB_OUTPUT_DIRECTORY_DEBUG ${OUT_LIB_PATH}/pdb
#linux .so 和 mac
LIBRARY_OUTPUT_DIRECTORY ${OUT_LIB_PATH}
LIBRARY_OUTPUT_DIRECTORY_DEBUG ${OUT_LIB_PATH}/debug
LIBRARY_OUTPUT_DIRECTORY_RELEASE ${OUT_LIB_PATH}/release
# debug 版本加后缀
DEBUG_POSTFIX "d"
)
通过
set_target_properties(dlib PROPERTIES
xxx xxx
xxx xxx
)
对动态库的属性进行设置,这里提供了
- windows 下 lib dll pdb
- linux / mac 下 .so
针对 debug 和 release 的路径设置,涉及到的参数有
- ARCHIVE_OUTPUT_DIRECTORY_DEBUG 、ARCHIVE_OUTPUT_DIRECTORY_RELEASE
- RUNTIME_OUTPUT_DIRECTORY_DEBUG、RUNTIME_OUTPUT_DIRECTORY_RELEASE
- PDB_OUTPUT_DIRECTORY_DEBUG
- LIBRARY_OUTPUT_DIRECTORY_DEBUG 、LIBRARY_OUTPUT_DIRECTORY_RELEASE
并针对 构建的debug 版本,添加后缀
DEBUG_POSTFIX “d”
可执行目标构建
file(WRITE src/main.cpp [=[
#include "dlib.h"
void slib();
int main()
{
dlib();
slib();
return 0;
}
]=])
add_executable(main src/main.cpp)
target_include_directories(main PRIVATE include)
target_link_libraries(main slib dlib)
可执行目标属性设置
set_target_properties(main PROPERTIES
# windows/linux 执行文件输出路径
RUNTIME_OUTPUT_DIRECTORY ${OUT_EXE_PATH}
RUNTIME_OUTPUT_DIRECTORY_DEBUG ${OUT_EXE_PATH}/debug
RUNTIME_OUTPUT_DIRECTORY_RELEASE ${OUT_EXE_PATH}/release
# 调试路径
VS_DEBUGGER_WORKING_DIRECTORY ${OUT_EXE_PATH}
# debug release 利用生成器表达式 判断CONFIG 来确定
VS_DEBUGGER_WORKING_DIRECTORY ${OUT_EXE_PATH}/$<IF:$<CONFIG:Debug>,debug,release>
)
if(MSVC)
set_target_properties(main PROPERTIES
# windows debug 版本加后缀
DEBUG_POSTFIX "d"
)
endif()
针对 可执行目标的 debug 和 release 特性,设置对应的输出路径
RUNTIME_OUTPUT_DIRECTORY_DEBUG 、RUNTIME_OUTPUT_DIRECTORY_RELEASE
在windows下,使用vs 进行调试,需要合理设置对应路径,否则会出现找不到的情况,这里通过生成表达式实现 根据配置 设置 debug 目录
VS_DEBUGGER_WORKING_DIRECTORY ${OUT_EXE_PATH}
# debug release 利用生成器表达式 判断CONFIG 来确定
VS_DEBUGGER_WORKING_DIRECTORY ${OUT_EXE_PATH}/$<IF:$<CONFIG:Debug>,debug,release>
)
并对 windows 下 可执行目标 debug版本 添加后缀
if(MSVC)
set_target_properties(main PROPERTIES
# windows debug 版本加后缀
DEBUG_POSTFIX "d"
)
endif()