在 cmake 脚本中,设置编译选项可以通过 add_compile_options 命令,也可以通过 set 命令修改 CMAKE_CXX_FLAGS 或 CMAKE_C_FLAGS 。
使用这两种方式在有的情况下效果是一样的,但请注意它们还是有区别的:
例子
也可以直接在编译的时候指定:
待补充
语法
在CMake中基础的数据形式是字符串。CMake也支持字符串列表。
列表通过分号分隔。譬如两个声明给变量VAR设同样的值:
字符串列表可以通过foreach命令迭代或直接 *** 控列表命令。
CMake 支持简单的变量可以是字符串也可以是字符串列表。变量参考使用 ${VAR} 语法。多参数可以使用 set 命令组合到一个列表中。所有其他的命令
通过空白分隔符传递命令来扩展列表,例如
像大多数语言一样,Cmake 提供了控制流结构。Cmake提供了三中控制流:
更多控制流信息参见命令 if,while,foreach,macro,function文档。
在CMake中原义字符串用双引号括起来。字符串可以是多行字符串,并在其中嵌入新的行。例如
也可以在一个字符串中转义字符和使用变量
同样支持标准C中的转义
如果字符在引号之前是空格则原义字符串只是原义字符串。但是引号必须成对,例如
cmake可以使用正则表达式
cmake project 头文件必须存在这行命令, 例如 cmake_minimum_required(VERSION 3.10)
设置项目名称 project(Tutorial)
语法
例子
语法
将指定的源文件(CPP文件)生成链接文件,然后添加到工程中去。
语法
其中 <name>表示库文件的名字,该库文件会根据命令里列出的源文件来创建。而 STATIC 、 SHARED 和 MODULE 的作用是指定生成的库文件的类型。
例子
在子文件夹添加了 library 或者 executable 之后,在上层目录添加 subdirectory , 也可以在同一个CMakeList.txt中使用
它相当于 g++ 选项中的 -I 参数的作用,也相当于环境变量中增加路径到CPLUS_INCLUDE_PATH变量的作用。
语法:
它相当于 g++ 命令的 -L 选项的作用,也相当于环境变量中增加 LD_LIBRARY_PATH 的路径的作用。
语法:
语法:
该指令的作用主要是指定要链接的库文件的路径,该指令有时候不一定需要。因为find_package和find_library指令可以得到库文件的绝对路径。不过你自己写的动态库文件放在自己新建的目录下时,可以用该指令指定该目录的路径以便工程能够找到。
语法:
link_libraries(library1 <debug | optimized>library2 ...)
可以链接一个,也可以多个,中间使用空格分隔.
语法:
语法:
简单的例子如下:
一般情况下, make install 在不指定 prefix 默认安装在`/usr/local/bin
CMALKE是一款开源的跨平台构建系统,这个名字是"Cross platform Make"的缩写。其工作依赖于 CMakeLists.txt 文件,通过该文件生成不同平台下对应的构建体。
跨平台构建时可从一下预定义区分编译环境:
cmake会将设置的变量存入 PROJECT_NAME 与 CMAKE_PROJECT_NAME 中。后续可以使用 ${PROJECT_NAME} 或 ${CMAKE_PROJECT_NAME} 调用。
将目录 dir 中的文件名,全部存入 variable 中。(这里不会递归调用子目录)
从源文件树收集文件列表,写入变量 variable 中。GLOB_RECURSE 将会递归所有匹配文件夹的子文件夹和匹配的文件。
source_group() 用于定义生成 IDE 工程时的源码分组。
使用指定的源文件将可执行文件添加到项目中,只有在 add_executable() 中的文件才会被 source_group 分组。
当添加外部库时,程序的编译构建需要以下信息:
这里需要区分链接路径和运行路径:连接器在处理动态库时将链接时路径(Link-time path)和运行时路径(Run-time path)分开,用户可以通过-L指定连接时库的路径,通过-R(或-rpath)指定程序运行时库的路径。
cmake设定 link_directories 添加链接器查找库的目录:
cmake设定 rpath :
系统自带的库的安装路径,在不同的机器上可能不同,使用cmake的find_package可自动搜索该路径。
以查找 JPEG 为例,系统如果找到了JPEG模块,那么cmake会设置以下变量供CMakeLists.txt使用:
给你个例子:project(NumRandom)
cmake_minimum_required(VERSION 2.8)
add_definitions(-D_UNICODE -DUNICODE)
add_definitions("/wd4819")
if(NOT ${CMAKE_BUILD_TYPE} MATCHES "Debug")
set(WINDOWS WIN32)
add_definitions(-D_IRR_STATIC_LIB_)
set(LIBRARIES Irrlicht_S.lib)
else()
set(LIBRARIES Irrlicht.lib)
endif()
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} /MANIFEST:NO")
foreach(flag_var
CMAKE_C_FLAGS CMAKE_C_FLAGS_DEBUG CMAKE_C_FLAGS_RELEASE
CMAKE_C_FLAGS_MINSIZEREL CMAKE_C_FLAGS_RELWITHDEBINFO
CMAKE_CXX_FLAGS CMAKE_CXX_FLAGS_DEBUG CMAKE_CXX_FLAGS_RELEASE
CMAKE_CXX_FLAGS_MINSIZEREL CMAKE_CXX_FLAGS_RELWITHDEBINFO)
if(${flag_var} MATCHES "/MD")
string(REGEX REPLACE "/MD" "/MT" ${flag_var} "${${flag_var}}")
endif()
endforeach()
aux_source_directory(. SRC_LIST)
add_executable(${PROJECT_NAME} ${WINDOWS} ${SRC_LIST})
set_target_properties(${PROJECT_NAME} PROPERTIES LINK_FLAGS "/ENTRY:mainCRTStartup")
target_link_libraries(${PROJECT_NAME} ${LIBRARIES})
以及一个target的调用方法:
cmd /C "if not exist Build (mkdir Build &&chdir Build &&cmake -G"NMake Makefiles" -DCMAKE_BUILD_TYPE=MinSizeRel .. &&nmake verbose=1) else chdir Build &&cmake -G"NMake Makefiles" -DCMAKE_BUILD_TYPE=MinSizeRel .. &&nmake"
注意其中的:-DCMAKE_BUILD_TYPE=MinSizeRel
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)