编译方式
-
内部编译
-
外部编译
mkdir build && cd build cmake .. && cmake --build .
CMAKE_BUILD_TYPE
• Debug: 通常一个典型的debug构建包含调试信息,没有被优化等;
• Release: 没有调试信息和完全优化的release构建;
• RelWithDebInfo:: 和release一样,但具有调试信息;
• MinSizeRel: 针对大小特殊优化的release;
#cmake 命令行传入编译类型
cmake -DCMAKE_BUILD_TYPE=debug ..
cmake -DCMAKE_BUILD_TYPE=RelWithDebInfo ..
cmake set变量设置
- normal变量
- 若cache中存在该变量,则值不会覆盖cache中值
- 普通变量赋值,若想在function函数调用者中,或父级CMakeLists.txt中的变量中赋值生效,需要加PARENT_SCOPE关键字(相当于引用或指针传递),include、macro可以直接展开,和function、父级CMakeLists.txt同样效果
set(varName value [PARENT_SCOPE])
#根目录CMakeLists.txt
set(numVar 10)
message(STATUS ${numVar}) # 10
add_subdirector(src)
message(STATUS ${numVar}) # 10,还是输出10
#parent_scope
add_subdirector(math)
message(STATUS ${numVar}) #20
#function
function(func arg1 isUpdate)
message(STATUS ${numVar}) # 20
if (not isUpate)
set(arg 30)
else
set(arg 30 PARENT_SCOPE)
endif()
message(STATUS "${numVar}")
endfunction()
func(numVar, false)
message(STATUS "${numVar}") #20
func(numVar, true)
message(STATUS "${numVar}") #30
#src子目录CMakeLists.txt
message(STATUS ${numVar}) # 10,可以直接访问numVar变量
set(numVar 20)
#math子目录CMakeLists.txt
message(STATUS ${numVar}) # 10,可以直接访问numVar变量
set(numVar 20 PARENT_SCOPE) #相当于引用或指针赋值,父级可访问修改后的值
-
cache变量
- 可以通过命令行-D形式对变量进行赋值并设置值到cache中,cache中有些内置cache变量,如CMAKE_INSTALL_PREFIX,CMAKE_BUILD_TYPE等
set(varName value CACHE type decription [FORCE])
, 未添加FORCE,优先从cache中获取变量值,没有则将值设置到cache中;- 添加FORCE,无论cache是否存在,都使用该值
-
env 变量
set(ENV{varName} value)
- 使用env变量
message(STATUS $ENV{varName})
Findxxx.cmake使用
- 工程比较大时,需要创建自己的cmake模块,通过设置
CMAKE_MODULE_PATH环境变量来告诉cmake模块在什么目录,在顶层CMakeLists.txt中设置
set(CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/cmake)
- 引用外部包时,使用
find_package()
命令在顶层CMakeLists.txt的cmake目录下查找Findxxx.cmake文件 - Findxxx.cmake文件撰写
#find header position find_path(third_INCLUDE_DIR mymath.h #头文件 "C:\\third" #指定头文件查找位置 ) #find lib position find_library(third_LIBRARY third "C:\\third\\Debug" ) #设置third相关变量,调用方使用 if (third_INCLUDE_DIR AND third_LIBRARY) set(third_FOUND TRUE) set(third_LIBRARIES ${third_LIBRARY}) set(third_INCLUDE_DIRS ${third_INCLUDE_DIR}) else() set(third_FOUND FALSE) message(WARNING "third not found") endif() #根据quiet or requied打印错误信息 if(third_FOUND) #third_FIND_QUIETLY对应于quiet if (NOT third_FIND_QUIETLY) message(STAUTS "Found third lib:${third_LIBRARIES}") endif() else() #未找到 #third_FIND_REQUIRED对应于required if (third_FIND_REQUIRED) message(FATAL_ERROR "could not find third") endif() endif()
#使用find_package
find_package(third requied) #没找到报错
if (third_FOUND)
include_directories(${third_INCLUDE_DIRS})
add_execute(Test Test.cpp)
target_link_libraries(Test ${third_LIBRARIES})
endif()