簡體   English   中英

如何設置CMake以生成僅標題項目?

[英]How do I set up CMake to generate header-only projects?

我想設置僅限標頭的C ++(或C)庫項目,但找不到干凈的方法。

經過一些搜索后,我發現你無法使用add_library建立一個普通的庫來執行此操作,因為它需要一個可編譯的源文件。 一種方法是使用add_custom_target ,這樣:

# Get all headers (using search instead of explicit filenames for the example)
file( GLOB_RECURSE XSD_HEADERS 
    *.hxx
)
add_custom_target( libsxsd SOURCES ${XSD_HEADERS} )

但這似乎並不完全在這里工作,因為我看不到VS2010中生成的項目中的源代碼。 我不知道這是一個錯誤,還是我做錯了,或者是否有一種首選的方式來做到這一點。

更新: CMake將很快包含一個名為INTERFACE的庫目標,非常適用於僅限標題的項目。 此功能目前在主分支中。 參考

建議使用命令add_custom_target (VS2010)。 這些文件整齊地列在我的項目中,但它的缺點是你不能用自定義目標定義任何“附加包含目錄”。 相反,我現在使用以下內容:

add_library(HEADER_ONLY_TARGET STATIC test1.hpp test2.hpp)
set_target_properties(HEADER_ONLY_TARGET PROPERTIES LINKER_LANGUAGE CXX)

這會將僅標題項目設置為虛擬歸檔目標。 不要擔心,如果您應該嘗試構建它,不會生成實際的二進制文件(至少在VS2010和Xcode 4中不會)。 命令set_target_properties就在那里,因為CMake會抱怨它不能僅從.hpp文件中推斷出目標語言。

您可以使用最新的Interface Library功能執行此操作:

add_library(mylib INTERFACE)
target_include_directories(mylib INTERFACE my_include_dir1 my_include_dir2)

這將創建一個沒有任何源文件的庫目標,並將include目錄添加到目標的INTERFACE_INCLUDE_DIRECTORIES屬性中。 這意味着鏈接到此庫的任何目標都將在構建時將這些目錄作為包含路徑( -I )。

例如,要將庫與可執行目標一起使用,只需執行以下操作:

add_executable(myexec ${MY_SOURCES})
target_link_libraries(myexec mylib)

我認為你要找的只是使用cmake“include_directories”命令添加一個include目錄

執行此操作時,如果它是您無法控制的第三方工具,我還會添加“SYSTEM”標志。

所以你的命令看起來像這樣:

include_directories(SYSTEM ${GTEST_INCLUDE_DIRS})

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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