2017-10-12 106 views
0

安裝庫和開發文件作爲單獨的組件我想創建兩個包含含供開發使用頭文件的共享庫,另一個。cmake的使用PUBLIC_HEADER

一個可行的解決方案是:

INSTALL(TARGETS mylib 
    COMPONENT core 
    LIBRARY DESTINATION ${LIBDIR} 
) 
INSTALL (
    DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} 
    COMPONENT devel 
    DESTINATION ${INCLUDEDIR} 
    FILES_MATCHING PATTERN "*.h") 

但是CMake的也有一個 「PUBLIC_HEADER」 目的地。 這樣的,你可以這樣做:

INSTALL(TARGETS mylib 
    LIBRARY DESTINATION ${LIBDIR} 
    PUBLIC_HEADER DESTINATION ${INCLUDEDIR} 
) 

我似乎無法得到這個工作。即使頭文件明確添加到ADD_LIBRARY(),也不會將任何內容安裝到$ {INCLUDEDIR}。有人可以指出一個這個應該如何工作的例子嗎?

與此的另一個問題是,我希望庫,並在不同的包報頭所以最好我想:

INSTALL(TARGETS mylib 
    COMPONENT core 
    LIBRARY DESTINATION ${LIBDIR} 
) 
INSTALL(TARGETS mylib 
    COMPONENT devel 
    PUBLIC_HEADER DESTINATION ${INCLUDEDIR} 
) 

但PUBLIC_HEADER似乎需要圖書館設置目標。 有沒有辦法做到這一點? PUBLIC_HEADER在安裝DIRECTORY方面有什麼優勢嗎?

回答

0

PUBLIC_HEADER是幾乎可以肯定錯誤的工作工具在這裏,除非你的共享庫是一個真正的OSX框架庫。文件也明確指出了這一點。

如果你想的頭文件被拷貝到安裝步驟的一部分,你應該使用install(FILES ...) command此:

install(FILES ${MY_PUBLIC_HEADERS} DESTINATION ${INCLUDEDIR} COMPONENT devel) 

這是有道理的,因爲CMake的有沒有從看目標推斷的方式您可能希望或可能不希望成爲安裝集的一部分的標頭。所以手動指定一個文件列表實際上是爲安裝指定標題的唯一明智的方式,並且install(FILES ...)就是這樣做的。

您應該避免使用的glob表達式這是好,因爲在給文件的潛在節約時間明確決不做辯護時,他們打破他們介紹頭痛。

+0

我不知道該文件是爲清晰:。我(錯誤)閱讀「在非Apple平臺上,可以使用PUBLIC_HEADER選項安裝這些頭文件以安裝(TARGETS)命令。」暗示這是做這件事的好方法。以某種方式分離公共和私人標題的想法也有吸引力。 –

+0

@BruceAdams我同意,這是一個容易犯的錯誤,特別是如果你正在尋找一個功能,只是你所問。 – ComicSansMS