【问题标题】:C++ CMake (add non-built files)C++ CMake(添加非构建文件)
【发布时间】:2012-06-10 21:43:18
【问题描述】:

我正在使用 cmake 来配置我的项目。我使用读取 CMakeLists.txt 的 qtcreator 可视化项目文件。 我有一些文本文件(非代码:配置文件、日志、..),我想将它们添加到我的 cmake 项目中,而不用(当然)编译/链接它们。可能吗 ? 主要目标是使用 qtcreator 在我的项目树中自动打开它们并编辑它们...... 感谢您的帮助。

【问题讨论】:

    标签: c++ cmake


    【解决方案1】:

    您应该能够将它们添加到您的源列表中,无论add_executableadd_library 调用是否合适,它们都会出现在 IDE 中。

    我相信 CMake 使用文件的扩展名来确定它们是否是实际的源文件,因此如果您的文件具有“.txt”或“.log”之类的扩展名,它们将不会被编译。

    【讨论】:

    • 谢谢。我想知道他们是否没有在 2.8 版本中添加像 add_doc() 这样的 smthg ?
    • @Eric 据我所知没有。您可以尝试在邮件列表中询问是否有这样做的计划。
    • 接口库怎么样,例如:add_library(${PROJECT_NAME} INTERFACE README.md) 它根本不允许这样做:“add_library INTERFACE library requires no source arguments”
    【解决方案2】:

    您好,我已经创建了这种函数:

    cmake_minimum_required(VERSION 3.5)
    # cmake_parse_arguments needs cmake 3.5
    
    ##
    # This function always adds sources to target, but when "WHEN" condition is not meet
    # source is excluded from build process.
    # This doesn't break build, but source is always visible for the project, what is 
    # very handy when working with muti-platform project with sources needed
    # only for specific platform
    #
    # Usage:
    #      target_optional_sources(WHEN <condition> 
    #                              TARGET <target>
    #                              <INTERFACE|PUBLIC|PRIVATE> [items2...]
    #                              [<INTERFACE|PUBLIC|PRIVATE> [items2...] ...])
    ##
    function(target_optional_sources)
        set(options OPTIONAL "")
        set(oneValueArgs WHEN TARGET)
        set(multiValueArgs PUBLIC PRIVATE INTERFACE)
    
        cmake_parse_arguments(target_optional_sources 
                              "${options}" "${oneValueArgs}" "${multiValueArgs}"
                              ${ARGN})
    
        target_sources(${target_optional_sources_TARGET}
                       PUBLIC ${target_optional_sources_PUBLIC}
                       PRIVATE ${target_optional_sources_PRIVATE}
                       INTERFACE ${target_optional_sources_INTERFACE})
    
        if (NOT ${target_optional_sources_WHEN})
    
            set_source_files_properties(${target_optional_sources_PUBLIC}
                                        PROPERTIES HEADER_FILE_ONLY TRUE)
            set_source_files_properties(${target_optional_sources_PRIVATE}
                                        PROPERTIES HEADER_FILE_ONLY TRUE)
            set_source_files_properties(${target_optional_sources_INTERFACE}
                                        PROPERTIES HEADER_FILE_ONLY TRUE)
    
        endif(NOT ${target_optional_sources_WHEN})
    
    endfunction(target_optional_sources)
    

    一方面它可以按预期工作,另一方面some error is reported,所以仍在努力。问题是我如何使用该功能而不是如何编写它。现在它完美地工作了。

    【讨论】:

      【解决方案3】:

      您可以创建自定义目标以使这些文件出现在您的 IDE 中,而不是添加构建库或可执行文件不需要的文件:

      add_custom_target(myapp-doc
          SOURCE readme.txt)
      

      【讨论】:

        猜你喜欢
        • 2020-03-14
        • 1970-01-01
        • 1970-01-01
        • 2020-09-09
        • 1970-01-01
        • 2021-10-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多