build - CMake项目中带有前缀的头文件

标签 build cmake

我已经建立了一个 CMake 项目,其目录结构如下所示:

src/
--CMakeLists.txt
--libA/
----CMakeLists.txt
----foo.h
----foo.cpp
--main/
----CMakeLists.txt
----main.cpp
src/CMakeLists.txt使用 add_subdirectory拉入libAmain . libA/CMakeLists.txt使用 add_library定义一个名为 libA 的库, 导出 foo.h通过 target_include_directories .如果我现在链接到 libAmain使用 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/

相关文章:

qt - 尝试将Qt应用程序与我的静态库链接时存在 undefined reference

ios - 错误:/. ../node_modules/native-base/Fonts/rubicon-icon-font.ttf:没有这样的文件或目录

android-studio - Gradle说由于 Volley 库,构建失败

build - 如何创建一个省略其内容时间戳的 tar 文件?

java - 在 ant 中使用较少的实用程序

python - 如何在 OSX 上使用 Python 编译 OpenCV 3.2.0?

c++ - CMake 的默认构建目标的名称是什么?

c++ - CMake Visual Studio 调试/发布 find_package

c++ - CMake 错误 try_compile pthreads of type executable

python - OpenVINO:如何使用推理引擎构建 OpenCV 以启用从模型优化器加载模型