CMake Note
这是一个我个人在使用CMake时记录的笔记。
FUNCTION vs MACRO
ARGC ARGV ARGN
- ARGC
- ARGV
- ARGN
include
add_subdirectory
创建新的工作域,并继承调用add_subdirectory的工作域。
CMAKE_PREFIX_PATH
find_package
Modules
FindPackageHandleStandardArgs
CMake 属性
- MSVC_RUNTIME_LIBRARY
这里主要涉及到的是MSVC下的运行时库链接问题,分为动态链接与静态链接,在默认情况都是才是动态链接的形式链接
到运行时库。使用该属性的核心是保证每一个依赖项的运行时库相同,官网已经为我们提供了简单直观的实例。
1 | add_executable(foo foo.c) |
- VS_DEBUGGER_ENVIRONMENT
为Visual Studio C++设置debug环境,这里比较直观的例子是当执行文件与依赖项不在
同一个目录下时,执行文件会因为无法获取依赖项而导致失败。这里涉及到Windows下的环境
变量PATH,依赖项不在PATH下,无法被执行文件发现,通过设置VS_DEBUGGER_ENVIRONMENT
可以添加额外的环境路径
项目顶级目录下的子目录创建
在Visual Studio等IDE进行开发时,用户可以创建虚拟的目录用于管理项目,这里CMake通过USE_FOLDERS属性可以开启
该功能,使用FOLDER可以给target这是目录。这里,全局属性USE_FOLDERS必须被设置为ON。
1 | set_property(GLOBAL PROPERTY USE_FOLDERS ON) |
通过为target设置目录。
1 | set_target_properties(<target_name> PROPERTIES FOLDER <dir for target>) |
额外,CMake会产生一些自动的target,如INSTALL, ALL_BUILD,这些被成为预定义目标,
则需要通过设置属性PREDEFINED_TARGETS_FOLDER。
1 | set_property(GLOBAL PROPERTY PREDEFINED_TARGETS_FOLDER "CMakeTargets") |
在Apple下链接framework
target_link_libraries(lib_name “-framework
“”)
在Apple下c++ -framework framework_name
例子
if(APPLE)
target_link_libraries(lib_name “-framework CoreFoundation””)
endif