【问题标题】:Why add header files into ADD_LIBRARY/ADD_EXECUTABLE command in CMake为什么在 CMake 中将头文件添加到 ADD_LIBRARY/ADD_EXECUTABLE 命令中
【发布时间】:2021-12-22 13:43:57
【问题描述】:

我有一个项目,它使用 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}
)

【问题讨论】:

标签: cmake


【解决方案1】:

在我们的项目中,我们使用您的“简单”方式 - 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)

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

【讨论】:

  • 我喜欢你合并两者的方式!另外,当导出选项使用 Eclipse CDT 时,看到了你提到的东西(项目文件省略了标题)。我想我会坚持你的解决方案。谢谢!
  • 在 add_library 中添加/未添加“headers”时,“安装”的第二种方式似乎不起作用。它在构建时抱怨no targets specified, no makefile found。有什么线索吗?
  • @parasrish 如果您不使用 SET_TARGET_PROPERTIES 命令定义标题,因为没有定义标题,它将不起作用。但是,如果您正确设置了“公共标头”的 SET_TARGET_PROPERTIES,则安装目标应该可以正常工作。
  • Visual Studio 自 VS2017 起支持正确的 CMake 和“打开文件夹”,并且不需要显示目标中列出的标头。 CMake 生成的 VS 项目无论如何都不是为人类正确制作的,并且当他们对构建配置的更改不持续时可能会使人们感到困惑。最佳现代实践应该是避免打开 CMake 生成的 VS 解决方案进行开发并从项目源中删除标头——它们不是编译源,因此是噪音。
  • 这不会为我的项目保留包含目录结构。
猜你喜欢
  • 1970-01-01
  • 2013-09-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-05
  • 2016-06-08
相关资源
最近更新 更多