簡體   English   中英

CMake 目標只是編譯一個源文件

[英]CMake target to just compile a source file

我正在使用 C++17 編寫一個只有頭文件的庫。 我想將它包含在“虛擬”源文件中:

#include "my/library.h"
// EOF

目的是確保庫正確包含其所有依賴項。 我還想在它上面運行靜態分析器,並盡可能多地啟用編譯器檢查來編譯它。

要創建一個普通的可執行目標,我需要添加main()函數,否則鏈接階段將失敗。 我想我也可以創建一個靜態庫目標,它應該可以正常工作,盡管它會創建一個我不需要的工件。

還有其他選擇嗎?

大多數編譯器允許您覆蓋輸入類型的默認擴展名。 如果您只是將my/library.h作為輸入文件傳遞給編譯器,它可以將其編譯為library.olibrary.obj

請注意,除了編譯可執行文件之外,您無法確定library.h是否完整。 特別是,C++ 要求非inline static const類成員在每個程序中被定義一次,如果它們被 odr 使用。 因此,如果您忘記在library.h inline ,您可能不會在簡單的測試中注意到這一點。 即使您添加了一個空的main() ,它仍然不會使用這些成員。

CMake 可以創建一個簡單的對象庫,它只會是一個.o.obj文件:

OBJECT庫類型定義了由編譯給定源文件產生的非歸檔對象文件集合。

為此,請在add_library()命令中使用OBJECT關鍵字:

add_library(MyObj OBJECT ${CMAKE_CURRENT_SOURCE_DIR}/library.cpp)
target_include_directories(MyObj PUBLIC ${CMAKE_CURRENT_SOURCE_DIR})

您可以稍后引用要編譯到其他庫或可執行文件中的目標文件:

add_library(MyLibrary STATIC 
    $<TARGET_OBJECTS:MyObj> 
    MyOtherSource.cpp 
    HelpersFunctions.cpp
)

暫無
暫無

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

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