[英]Header files with prefix in CMake project
我已經建立了一個 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
的公共接口提供前綴,以便我可以(並且必須)在main.cpp
編寫#include <libA/foo.h>
?
這是一個老問題,但我遇到了完全相同的問題。 我最終通過添加一個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>
。
您可以在target_include_directories()
調用中使用根源目錄(或某個其他目錄,它是libA
的父目錄target_include_directories()
。 這將允許針對另一個目錄(在本例中為CMAKE_SOURCE_DIR
)定義INTERFACE_INCLUDE_DIRECTORIES
目標屬性。 所以它看起來像這樣:
在libA/CMakeLists.txt
:
add_library(libA foo.cpp)
# Define the include files with respect to the directory above this.
target_include_directories(libA PUBLIC ${CMAKE_SOURCE_DIR})
main/main.cpp
文件:
#include <iostream>
#include <libA/foo.h>
int main() {
FooClass fooclass;
fooclass.myFunction();
std::cout << "Hello World!" << std::endl;
return 0;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.