2016-04-15 81 views
9

據我瞭解INTERFACE庫像Visual Studio property sheets,所以非常有用。我們可以使用它來鏈接靜態庫並傳播屬性。IMPORTED目標和INTERFACE庫之間有什麼區別?

IMPORTED目標打擾我:我看不到只有IMPORTED目標才能解決的問題。

+2

@Antonio這個問題與Visual Studio被標記爲這樣有什麼關係? – Angew

+0

@Angew它指的是Visual Studio屬性表,其中我什麼都不知道。雖然我知道CMake,但我無法完全理解這個問題。換言之,要充分回答這個問題,關於Visual Studio的知識也是必要的。 – Antonio

回答

10

當你創建一個導入的目標時,你告訴CMake:我有這個{靜態庫|共享庫|模塊庫|可執行文件}已經構建在磁盤上的此位置。我希望能夠像對待我的ons構建系統構建的目標一樣對待它,所以請注意,當我說ImportedTargetName時,它應該引用磁盤上的二進制文件(以及相關的導入庫,如果適用,等等)。

當你創建一個接口庫時,你告訴CMake:我有這套客戶端可以使用的屬性(包括目錄等),所以如果他們「鏈接」到我的接口庫,請將這些屬性傳播給他們。

最根本的區別是界面庫不受磁盤上的任何東西的支持,它們只是一組需求/屬性。你可以如果你真的想在接口庫上設置INTERFACE_LINK_LIBRARIES屬性,但這不是他們真正想要的。它們將封裝客戶端可使用的屬性,並且主要用於C++中僅包含頭文件的庫。

另請注意,一個接口庫是一個 —有沒有接口可執行文件,但你確實可以導入可執行文件。例如。對野牛包配置文件可以定義導入目標野牛可執行文件,那麼你的項目可以使用它的自定義命令:

# In Bison package config file: 
add_executable(Bison IMPORTED) 
set_property(TARGET Bison PROPERTY IMPORTED_LOCATION ...) 

# In your project: 
find_package(Bison) 
add_custom_command(
    OUTPUT parser.c 
    COMMAND Bison tab.y -o parser.c 
    DEPENDS tab.y 
    ... 
) 

(野牛被使用,就像你可能希望使用的一些例子自定義命令和命令行可能不正確)。

1

看起來好像有很多重疊。說你有磁盤上的共享庫和頭,並要使其可讓您的CMake位可以做到這一點

target_link_libraries(my_target foo) 

,並自動將其鏈接獲得必要的include目錄。

你可以做到這一點無論是這樣的:

find_package(Foo) 

add_library(foo SHARED IMPORTED) 
set_target_properties(foo PROPERTIES 
    IMPORTED_LOCATION ${FOO_LIBRARIES} # The DLL, .so or .dylib 
    INTERFACE_INCLUDE_DIRECTORIES ${FOO_INCLUDE_DIR} 
    INTERFACE_COMPILE_DEFINITIONS "ENABLE_FOO" 
) 

或者這樣:

add_library(foo INTERFACE) 
target_link_libraries(foo INTERFACE ${FOO_LIBRARIES}) 
target_include_directories(foo INTERFACE ${FOO_INCLUDE_DIR}) 
target_compile_definitions(foo INTERFACE "-DENABLE_FOO") 

他們工作和行爲相同,據我可以告訴。甚至有一個'導入的界面庫'可通過add_library(foo INTERFACE IMPORTED)獲得,儘管這似乎並不奏效,我也不知道它的用途。

坦率地說,文檔並沒有真正解釋你應該使用哪些庫,而且我恐怕沒有發現Angew的「這不是他們設計的」。

我猜是要用。我認爲界面庫更容易理解,並且與內部庫的屬性INTERFACE的使用更加一致。

相關問題