在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拉入libAmainlibA/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 中带有前缀的文件?

片段中带有 RequestPermission 的 registerForActivityResult 不起作用

Cmake 中的 GCC -Bprefix

python-3.6中带有'f'前缀的字符串