0%

cmake-note

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
2
3
4
5
6
add_executable(foo foo.c)
# MultiThreaded表示需要使用静态链接,但是注意,在Debug与Release下是链接到不同的库,
# 所以这里使用了cmake-generator-expressions,在Debug模式时实际生成MultiThreadedDebug(MTd),
# 其他则是MultiThreaded(/MT)
set_property(TARGET foo PROPERTY
MSVC_RUNTIME_LIBRARY "MultiThreaded$<$<CONFIG:Debug>:Debug>")
  • 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,如INSTALLALL_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