我有一个项目使用CMake作为构建工具,为我和我的同事制作了一个简单的模板。当我在网上搜索最好和易于使用的实践时,我遇到了制作图书馆的不同方法。
在这个模板中,我在两个单独的变量中列出了头文件和源文件,我没有将头文件传递给add_library
命令 - 只是源代码。然后我使用set_target_properties
和PUBLIC_HEADER
变量来提供标题文件列表。
到目前为止它似乎有效,但我想知道我是否正在制造不必要的复杂事物。有些人在线提供头文件到add_library命令,甚至不使用set_target_properties
等。
简而言之:
add_library
还是不应该(作为最佳做法)?这两种用法的影响。 (这是我正在谈论的模板:)
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}
)
答案 0 :(得分:12)
在我们的项目中,我们使用"简单"你的方式 - add_library
包含标题和来源。
如果只添加源,那么您将无法在IDE生成的项目中看到标题。
但是,在安装时,我们必须这样做,使用两个install
命令:
install(TARGETS library_name
LIBRARY DESTINATION lib)
install(FILES ${PUBLIC_HEADERS}
DESTINATION include/library_name)
如果您想将其作为单个命令执行,则可以按照建议将set_target_properties
与PUBLIC_HEADER
一起使用。
然后,这种install
是可能的:
install(TARGETS library_name
LIBRARY DESTINATION lib
PUBLIC_HEADER DESTINATION include/library_name)
选择你最喜欢的那个并坚持下去。