2014-09-22 32 views
4

CMake似乎不支持定義導出或安裝目標的名稱空間和相應庫文件的名稱之間的關係。CMake:強制命名空間和庫文件名之間的關係

因此,例如,CMake的可以很容易地創建包含明確命名目標如MyOrg::MyLibrary(使用export(EXPORT ...)install(EXPORT ...)命令的NAMESPACE選件包,但實際.A,.LIB,。所以,還是。 dll文件仍然會獲得全局空間名稱,如libMyLibrary.a:命名空間不會輸入到庫文件名中

當然可以自己將命名空間應用於目標;在上面的示例中,您可以命名目標MyOrgMyLibrary,導致一個庫文件名,如「libMyOrgMyLibrary.a」。這是可以的我猜,除了這使得NAMESPACE選項本質上是無用的(或者你最終將目標ts命名爲MyOrg::MyOrgMyLibrary),讓我覺得我錯過了一些東西。

有沒有辦法來覆蓋生成的庫的名稱?或者用CMake的「正確」方式來確保庫文件得到明確的名稱?

回答

5

整個命名空間的東西比名稱暗示的要弱得多。這實際上只不過是一個命名約定。我看到在大量庫(如Qt)附帶的巨大框架中的主要優勢,但你是對的,它本身並不太有用。

另請注意,該機制僅關注避免CMake腳本中的名稱衝突,而不是,這些名稱與文件系統上的名稱衝突有關。後者需要在另一層面上解決。避免這些的最簡單方法當然是將庫安裝到子目錄中。那麼你幾乎只需要擔心自己項目中的nameclashes。不幸的是,這種方法有其自身的缺點。在Unix上,除了存儲特定於應用程序的庫(感謝@JPNotADragon for pointing this out)之外,用戶不鼓勵將子目錄創建爲/usr/lib

否則,像前綴這樣的常用技術應用,您已經提到過。

我同意,這個功能不像人們希望的那樣強大。但是再一次,名稱衝突是一個不平凡的問題,最終合理的命名約定可能仍然是最好的解決方案。

+1

嗨再次ComicSansMS,感謝您的見解。關於將庫安裝到一個子目錄 - 我看了一下FHS(Linux標準庫),它說'lib'目錄下的子目錄是爲應用程序特定的庫保留的。快速查看我的Linux服務器的'usr/lib'似乎證實了這一點。這實際上只會將我們的前綴作爲唯一的剩餘選項。 – JPNotADragon 2014-09-23 11:40:03

+0

@JPNotADragon好的發現FHS。我會將其納入答案。 – ComicSansMS 2014-09-23 12:19:33

+0

[CppTemplates項目](https://github.com/JPGygax68/CppTemplates)更新(沒有更多的命名空間) – JPNotADragon 2014-09-24 10:36:15

2

有沒有辦法來覆蓋生成的庫的名稱?

是。請參閱OUTPUT_NAME屬性。

可以想象,你可以在一個函數把這個包(未測試,應該給你正確的想法,但可能含有錯誤):

function(my_add_library NAME) 
    add_library(${NAME} ${ARGN}) 
    set_target_properties(${NAME} PROPERTIES OUTPUT_NAME my_${NAME}) 
endfunction()