美文网首页
build system

build system

作者: 码农崛起 | 来源:发表于2018-11-16 10:42 被阅读0次

    添加target

    1. add_executable(mytool mytool.cpp)添加可执行target
    2. add_library(archive SHARED archive.cpp zip.cpp lzma.cpp)添加lib,lib类型包括:
    • SHARED:动态库/共享库,dll/so/dylib
    • STATIC:静态库,.lib/.a
    • MODULE:插件资源文件等类型,不导出符号,不可用于链接,用于动态加载
    • OBJECT:不用于生成库文件,定义表示obj文件集合的变量
    add_library(archive OBJECT archive.cpp zip.cpp lzma.cpp)
    add_library(archiveExtras STATIC $<TARGET_OBJECTS:archive> extras.cpp)
    add_executable(test_exe $<TARGET_OBJECTS:archive> test.cpp)
    

    定义编译参数

    # 对应gcc/clang的 -I
    target_include_directories(target, 
                        <model>  <include文件夹>)
    # 对应gcc/clang的-D
    target_compile_definitions(target, 
                        <model>  <宏定义>)
    # 对应gcc/clang的-f/-m/-W
    target_compile_options(target,
                        <model>  <编译器flag>)
    

    这三个指令定义了target的两组属性:

    以下三个属性编译自己时使用

    • INCLUDE_DIRECTORIES
    • COMPILE_DEFINITIONS
    • COMPILE_OPTIONS

    target_link_libraries(a b)时a会从b的以下三个属性继承值到自己的属性,
    a.INCLUDE_DIRECTORIES += b.INTERFACE_INCLUDE_DIRECTORIES

    • INTERFACE_INCLUDE_DIRECTORIES,
    • INTERFACE_COMPILE_DEFINITIONS,
    • INTERFACE_COMPILE_OPTIONS

    modle可以是以下三个类型:

    • PRIVATE:只有源文件使用,只定义非INTERFACE_变量
    • PUBLIC:源文件和头文件都使用,两组变量都定义
    • INTERFACE:只有头文件使用,只定义INTERFACE_变量
    add_library(archive archive.cpp)
    target_compile_definitions(archive INTERFACE USING_ARCHIVE_LIB)
    
    add_library(serialization serialization.cpp)
    target_compile_definitions(serialization INTERFACE USING_SERIALIZATION_LIB)
    
    add_library(archiveExtras extras.cpp)
    target_link_libraries(archiveExtras PUBLIC archive)
    target_link_libraries(archiveExtras PRIVATE serialization)
    # archiveExtras is compiled with -DUSING_ARCHIVE_LIB and -DUSING_SERIALIZATION_LIB
    
    add_executable(consumer consumer.cpp)
    # consumer is compiled with -DUSING_ARCHIVE_LIB
    target_link_libraries(consumer archiveExtras)
    
    # 可以同时link多个不同的model
    target_link_libraries(archiveExtras
      PUBLIC archive
      PRIVATE serialization
    )
    
    # include可以时绝对路径或相对路径(相对于当前CMakeLists.txt)
    add_library(lib1 lib1.cpp)
    target_include_directories(lib1 PRIVATE
      /absolute/path
      relative/path
    )
    

    target输出目录

    RUNTIME_OUTPUT_DIRECTORY和RUNTIME_OUTPUT_NAME控制以下target的输出目录和文件名称

    • add_executable()生成的可执行文件
    • add_library(target SHARED ...)在Windows上生成的动态库

    LIBRARY_OUTPUT_DIRECTORY和LIBRARY_OUTPUT_NAME控制以下target的输出目录和文件名称

    • add_library(target MODULE ...)生成的不导出符号的插件动态库
    • add_library(target SHARED ...)在linux/osx上生成的动态库

    ARCHIVE_OUTPUT_DIRECTORY和ARCHIVE_OUTPUT_NAME控制以下target的输出目录和文件名称

    • add_library(target STATIC ...)生成的静态库
    • add_library(target SHARED ...)在Windows上生成动态库时,导出符号所在的.lib文件
    • add_executable()在Windows上设置了ENABLE_EXPORTS属性时,导出符号所在的.lib文件
    add_executable(redis main.c)
    
    set_target_properties(redis
            PROPERTIES RUNTIME_OUTPUT_DIRECTORY lib)
    set_target_properties(redis
            PROPERTIES RUNTIME_OUTPUT_NAME test)
    

    编译一些简单的项目,这些就够用啦!!!

    相关文章

      网友评论

          本文标题:build system

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