cmake文档虽然之前自己没写过,不过systemworkbench里和Clion里都接触到了里面的各种参数,所以要自己写一个CMakeLists.txt还是比较无痛的。
主要部分如下:
- 编译器声明:
cmake_minimum_required(VERSION 2.8)
- Project名称:
project(test)
这一行指定项目的名称,指定项目名称最主要的目的在于启用几个和环境相关的变数,另外也会在 makefile 增加对应的 target。
set (CMAKE_CXX_STANDARD 11)
采用c++11标准编译
- message:
message("config types: ${CMAKE_CONFIGRATION}")
- 添加的声明(这里和SW4STM32里DEFIN选项里参数一样)
add_definitions(-DEXTERNAL)
- Include文件夹地址
include_directories(
${PROJECT_SOURCE_DIR}
${PROJECT_SOURCE_DIR}/include/
${PROJECT_SOURCE_DIR}/thirdparty/stm32/include/
${PROJECT_SOURCE_DIR}/thirdparty/RTOS/include/
)
- 链接文件地址
link_directories(
${PROJECT_SOURCE_DIR}/thirdparty/stm32/lib/
${PROJECT_SOURCE_DIR}/thirdparty/RTOS/lib/
)
- 设定一个名为SOURCE_LIST的变量,用于汇集所有的源文件的地址
set(SOURCE_LIST
src/main.cpp
)
- 建立可执行文件
add_executable(test ${SOURCE_LIST})
建立一个名为test的可执行文件,源文件通过SOURCE_LIST变量输入
- 指定链接项目
target_link_libraries(
stm32
RTOS
)
指令 target_link_libraries()用于指定 target 所需要链接的项目,并且可以依不同组态选择不同的连结项目。
注意这里的库文件一定要放在指定目录下,不然会找不到
- 库生成
link_directories(${PROJECT_SOURCE_DIR}/lib)
add_library(data STATIC ${SOURCE_FILES})
这里从之前设置的SOURCE_FILES
变量里生成一个库文件。其中STATIC
表示生成静态库,SHARED
是生成动态库。生成库文件可以用于上文提到的target_link_libraries()
链接
关于静态库和动态库的区别解释如下:
静态库:链接时完整地拷贝至可执行文件中,被多次使用就有多份冗余拷贝。
动态库:链接时不复制,程序运行时由系统动态加载到内存,供程序调用,系统只加载一次,多个程序共用,节省内存。
- 链接库
target_link_libraries(hello A B.a C.so)
将若干库文件链接到生成的目标hello(libhello.a或libhello.so)
需要注意的是,target_link_libraries里库文件的顺序符合gcc链接顺序的规则,即被依赖的库放在依赖它的库的后面,比如上面的命令里,libA.so可能依赖于libB.a和libC.so,如果顺序有错,链接时会报错。还有一点,B.a会告诉CMake优先使用静态链接库libB.a,C.so会告诉CMake优先使用动态链接库libC.so,也可直接使用库文件的相对路径或绝对路径。使用绝对路径的好处在于,当依赖的库被更新时,make的时候也会重新链接。
- 指定输出目录
set(OUTPUT_ROOT ${PROJECT_SOURCE_DIR}/output)
关于输出目录还可以依次指定:
在前面的例子里我们并没有特别指定输出档的位置,因此档案会分布在 binary tree 当中,而 binary tree 的架构则和 source tree 相同。
这里先介绍 CMake 对于档案的分类
Windows Unix
RUNTIME .exe、.dll 可执行档
LIBRARY .so
ARCHIVE .a、.lib
包含 dll 的连结界面 .a
对应三者输出位置的全域变数为 CMAKE_RUNTIME_OUTPUT_DIRECTORY、>CMAKE_LIBRARY_OUTPUT_DIRECTORY 和 >CMAKE_ARCHIVE_OUTPUT_DIRECTORY。通常我们可能会这样指定:
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin)
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib)
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib)
上面这种写法会将整个 binary tree 下所建置的执行档以及静态、共享程式库搜集到建置目录的 bin 和 lib 下。
参考文档:
维基教科书-CMake 入门