美文网首页
cmake文档书写

cmake文档书写

作者: 汨罗在北方 | 来源:发表于2017-08-10 15:46 被阅读178次

    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 入门

    相关文章

      网友评论

          本文标题:cmake文档书写

          本文链接:https://www.haomeiwen.com/subject/oqehrxtx.html