cmake文档书写

2017-08-10  本文已影响178人  汨罗在北方

cmake文档虽然之前自己没写过,不过systemworkbench里和Clion里都接触到了里面的各种参数,所以要自己写一个CMakeLists.txt还是比较无痛的。

主要部分如下:

cmake_minimum_required(VERSION 2.8)
project(test)

这一行指定项目的名称,指定项目名称最主要的目的在于启用几个和环境相关的变数,另外也会在 makefile 增加对应的 target。

set (CMAKE_CXX_STANDARD 11)

采用c++11标准编译

message("config types: ${CMAKE_CONFIGRATION}")
add_definitions(-DEXTERNAL)
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/
)
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 入门

上一篇下一篇

猜你喜欢

热点阅读