我已经建立了一个 CMake 项目,其目录结构如下所示:
src/
--CMakeLists.txt
--libA/
----CMakeLists.txt
----foo.h
----foo.cpp
--main/
----CMakeLists.txt
----main.cpp
src/CMakeLists.txt
使用 add_subdirectory
拉入libA
和 main
. libA/CMakeLists.txt
使用 add_library
定义一个名为 libA
的库, 导出 foo.h
通过 target_include_directories
.如果我现在链接到 libA
在 main
使用 target_link_library
, 我可以包含 foo.h
通过 #include <foo.h>
在 main.cpp
.问题:是否可以提供
libA
的公共(public)接口(interface)?带前缀,这样我就可以(并且必须)写#include <libA/foo.h>
在 main.cpp
反而?
最佳答案
这是一个老问题,但我遇到了完全相同的问题。我最终通过添加 export_headers()
来解决这个问题在二进制文件中创建指向 header 的符号链接(symbolic link)的函数:
function(export_headers TARGET HEADER_SOURCE_DIR HEADER_DEST_DIR)
# Put all headers that are in the source directory into EXPORT_HEADERS variable
file(GLOB_RECURSE EXPORT_HEADERS CONFIGURE_DEPENDS
RELATIVE "${HEADER_SOURCE_DIR}"
"${HEADER_SOURCE_DIR}/*.h"
)
# For each header that will be exported
foreach(HEADER ${EXPORT_HEADERS})
# Get the directory portion that needs to be created
get_filename_component(HEADER_DIRECTORY "${HEADER}" DIRECTORY)
# Create the directory
add_custom_command(TARGET ${TARGET} POST_BUILD
COMMAND ${CMAKE_COMMAND} -E make_directory "${HEADER_DEST_DIR}/${HEADER_DIRECTORY}"
)
if (MSVC)
# Make a hard link to the file
add_custom_command(TARGET ${TARGET} POST_BUILD
COMMAND if not exist "${HEADER_DEST_DIR}/${HEADER}" \( mklink /h "${HEADER_DEST_DIR}/${HEADER}" "${HEADER_SOURCE_DIR}/${HEADER}" \)
)
else()
# Make a symbolic link to the file
add_custom_command(TARGET ${TARGET} POST_BUILD
COMMAND ln -sf "${HEADER_SOURCE_DIR}/${HEADER}" "${HEADER_DEST_DIR}/${HEADER}"
)
endif()
endforeach(HEADER)
endfunction()
你可以这样称呼它:
add_library(libA STATIC ${LIBA_SOURCES}
export_headers(libA ${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_CURRENT_BINARY_DIR}/include/libA)
target_include_directories(libA INTERFACE ${CMAKE_CURRENT_BINARY_DIR}/include)
那么,如果你链接到
libA
,您将能够 #include <libA/foo.h>
.
关于build - CMake项目中带有前缀的头文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38879819/