簡體   English   中英

CMake 項目中帶有前綴的頭文件

[英]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來拉入libAmain libA/CMakeLists.txt使用add_library定義一個名為庫libA ,其中出口foo.h通過target_include_directories 如果我現在針對鏈接libAmain使用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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM