cmake - 为什么在 CMake 中将头文件添加到 ADD_LIBRARY/ADD_EXECUTABLE 命令中

标签 cmake

我有一个使用 CMake 作为构建工具的项目,并为我和我的同事制作了一个简单的模板。当我在网上搜索最佳且易于使用的实践时,我遇到了创建库的不同方法。

在这个模板中,我在两个单独的变量中列出了头文件和源文件,我没有将头文件传递给 add_library命令 - 只是来源。然后我使用 set_target_propertiesPUBLIC_HEADER变量给出头文件列表。

到目前为止它似乎有效,但我想知道我是否让事情变得不必要地复杂。网上有些人也给 add_library 命令提供头文件,甚至不使用 set_target_properties诸如此类。

简而言之:

  • 我们应该将头文件包含到 add_library 中吗?或者我们不应该(作为最佳实践)?以及两种用法的影响。
  • 在 add_library/add_executable 中添加标题的目的是什么?即使没有它,它们似乎也能工作(似乎只是前向声明和符号)。请确认理解。


  • (这是我正在谈论的模板:)
    cmake_minimum_required(VERSION 3.1.0)
    
    project(lae CXX C) 
    set(CMAKE_CXX_STANDARD 14)
    
    include_directories(
      ${CMAKE_CURRENT_SOURCE_DIR}
    )
    
    set(SOURCE_FILES
        ...
    )
    
    set(HEADER_FILES 
       ...
    )
    
    set( PRIVATE_HEADER_FILES
       ...
    )
    
    add_library(${PROJECT_NAME} SHARED ${SOURCE_FILES} ) 
    
    set( REQUIRED_LIBRARIES
       ...
    )
    
    target_link_libraries(${PROJECT_NAME} ${REQUIRED_LIBRARIES} )
    
    SET_TARGET_PROPERTIES( 
      ${PROJECT_NAME}  
    PROPERTIES 
      FRAMEWORK ON
      SOVERSION 0
      VERSION 0.1.0
      PUBLIC_HEADER "${HEADER_FILES}"
      PRIVATE_HEADER "${PRIVATE_HEADER_FILES}"
      ARCHIVE_OUTPUT_DIRECTORY "lib"
      LIBRARY_OUTPUT_DIRECTORY "lib"
      OUTPUT_NAME ${PROJECT_NAME}
    )
    

    最佳答案

    在我们的项目中,我们使用您的“简单”方式 - add_library带有标题和来源。

    如果仅添加源,则在 IDE 生成的项目中将看不到标题。

    但是在安装的时候,我们就得这样了,用两个install命令:

    install(TARGETS library_name
            LIBRARY DESTINATION lib)
    
    install(FILES ${PUBLIC_HEADERS} 
            DESTINATION include/library_name)
    

    如果您想将其作为单个命令执行,可以使用 set_target_propertiesPUBLIC_HEADER ,正如你所建议的。
    那么,这种install是可能的:
    install(TARGETS library_name
            LIBRARY DESTINATION lib
            PUBLIC_HEADER DESTINATION include/library_name)
    

    选择你最喜欢的那个并坚持下去。

    关于cmake - 为什么在 CMake 中将头文件添加到 ADD_LIBRARY/ADD_EXECUTABLE 命令中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36174499/

    相关文章:

    cmake - 如何将自定义构建类型添加到cmake? (定位品牌)

    c++ - CMake看不到系统变量

    c - 使用 CMake 在 CLion 中构建引发错误

    visual-studio - 如何在 Visual Studio 中使用 LibTooling/Clang?

    c++ - Cmake 无法识别 MSVC 编译器

    c++ - Cmake 外部资源

    cmake - 错误的 CMAKE_BINARY_DIR?

    c++ - -DXXX 编译器参数的 CMAKE 选项

    c++ - 在 CLion 项目中链接 boost

    c++ - cmake在Mac OS X上找不到openssl库(尽管手动添加)