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

时间:2016-03-23 09:39:14

标签: 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}
)

1 个答案:

答案 0 :(得分:12)

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

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