在CMake项目中带有前缀的头文件
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在CMake项目中带有前缀的头文件相关的知识,希望对你有一定的参考价值。
我已经设置了一个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
提供前缀的公共接口,以便我可以(并且必须)在#include <libA/foo.h>
中编写main.cpp
?
答案
这是一个老问题,但我遇到了完全相同的问题。我最后通过添加一个export_headers()
函数来解决这个问题,该函数创建了二进制文件中标题的符号链接:
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>
。
以上是关于在CMake项目中带有前缀的头文件的主要内容,如果未能解决你的问题,请参考以下文章
如何在我的 cmake 项目中包含另一个 cmake 项目的头文件?
CMake GoogleTests 在我的测试文件中找不到导入的头文件
如何从 s3 存储桶中获取 Pyspark 中带有前缀的文件?