编译选项
在cmake脚本中,设置编译选项有两种方式:
1、可以通过add_compile_options命令;
2、也可以通过set命令修改CMAKE_CXX_FLAGS或CMAKE_C_FLAGS。
存在即合理,那么使用这两种方式存在怎样的区别?
1. add_compile_options命令添加的编译选项是对所有编译器的(包括c和c++编译器),
2. set命令设置CMAKE_C_FLAGS或CMAKE_CXX_FLAGS变量则是分别只针对c和c++编译器的。
例子
#判断编译器类型,如果是gcc编译器,则在编译选项中加入c++11支持if(CMAKE_COMPILER_IS_GNUCXX) set(CMAKE_CXX_FLAGS "-std=c++11 ${CMAKE_CXX_FLAGS}") message(STATUS "optional:-std=c++11")endif(CMAKE_COMPILER_IS_GNUCXX)
CMAKE_C_COMPILER:指定C编译器
CMAKE_CXX_COMPILER:指定C++编译器
CMake的输入
COMMAND(args)
这里的 COMMAND 是命令行的名称,args是用空格分割的参数列表。典型的,对与每一个项目的目录存在一个CMakeLists.txt。 下面我们将从一个简单的Hello cmake例子开始介绍, 它的源代码树形文件包含两个文件,源文件和cmake文件:
Hello.c CMakeLists.txt
CMakeLists.txt将包含下面两行:
PROJECT(Hello)
add_executable(Hello Hello.c)
为了生成Hello的可执行程序,你只需依照上面CMake运行的过程描述来生成makefiles文件。 PROJECT 命令表明了产生的工作空间的名称。 add_executable命令添加可执行的目标到生成程序。这个简单的程序就只需要这些设置。如果你的项目需要一些文件才能编译也很容易,只想修改ADD_EXECUTABLE命令行如下:
ADD_EXECUTABLE(Hello Hello.c hello2.c hello3.c hello4.c)
add_executable为增加可执行文件,第一个参数为项目名称,接下来的参数为源代码文件,不包含头文件
语法
1、设置项目名称
project(demo)
最好写上,它会引入两个变量 demo_BINARY_DIR 和 demo_SOURCE_DIR,同时,cmake 自动定义了两个等价的变量 PROJECT_BINARY_DIR 和 PROJECT_SOURCE_DIR。
2、设置编译类型
# 生成可执行文件
add_executable(demo demo.c)
# 生成静态库
add_library(common STATIC util.cpp)
# 生成动态库或共享库
add_library(common SHARED util.c)
add_library 默认生成是静态库,通过以上命令生成文件名字,
在 Linux 下是:demo libcommon.a libcommon.so
在 Windows 下是:demo.exe common.lib common.dll
3、指定编译包含的源文件
# 明确指出包含哪些源文件
add_library(demo demo.c test.cpp util.c)
# 搜索所有的cpp文件(发现一个目录(dir)下所有的源代码文件并将列表存储在一个变量(VAR)中)
aux_source_directory(dir VAR)
# 搜索当前目录下的所有.c文件
aux_source_directory(. SRC_LIST)
add_library(demo ${SRC_LIST})
自定义搜索规则:
file(GLOB SRC_LIST "*.c" "protocol/*.c")
add_library(demo ${SRC_LIST})
# 或者
file(GLOB SRC_LIST "*.c")
file(GLOB SRC_PROTOCOL_LIST "protocol/*.c")
add_library(demo ${SRC_LIST} ${SRC_PROTOCOL_LIST})
# 或者
aux_source_directory(. SRC_LIST)
aux_source_directory(protocol SRC_PROTOCOL_LIST)
add_library(demo ${SRC_LIST} ${SRC_PROTOCOL_LIST})
4、查找指定的库文件
find_library(VAR name path)查找到指定的预编译库,并将它的路径存储在变量中。
默认的搜索路径为 cmake 包含的系统库,因此如果是 NDK 的公共库只需要指定库的name 即可(不需path)。
find_library(log-lib,log)
类似的命令还有 find_file()、find_path()、find_program()、find_package()。
5、设置包含的目录
include_directories(
${CMAKE_CURRENT_SOURCE_DIR}
${CMAKE_CURRENT_BINARY_DIR}
${CMAKE_CURRENT_SOURCE_DIR}/include
)
6、设置target需要链接的库
# 目标库 demo # 目标库需要链接的库 ${log-lib}
target_link_libraries
7、设置变量
set 直接设置变量的值
set(SRC_LIST main.cpp test.cpp)add_executable(demo ${SRC_LIST})
2. set 追加设置变量的值
set(SRC_LIST main.cpp)set(SRC_LIST ${SRC_LIST} test.cpp)add_executable(demo ${SRC_LIST})