2017-09-15 50 views
3

我使用Cygwin 2.9.0-2,其中包括cmake 3.6.2。我正在嘗試使用cmake 2.8在CentOS上開發一個cmake文件來運行。這是一個很大的cmake文件,導入了各種庫,包括編譯所有單元測試以再次運行gtest。Cygwin gcc預期什麼庫類型?

我完全不瞭解cygwin gcc是否想要Windows或Linux庫來鏈接輸入,以及它產生了什麼。我一直無法谷歌答案這個問題:Cygwin希望.a/.so或.lib/.dll文件在庫中編譯,它是否創建相同,或者它根本不在乎。畢竟,它正在編譯要在Windows上運行的可執行文件,因此我預計它只能生成.lib/.dll,並期望它們。

我有什麼困惑的是,我已經克隆了gtest repo,它的內置和安裝到/usr/local/lib/libgtest.a,我鏈接了我的供應商的*.lib庫,但鏈接器找不到gtest庫。我是否需要修改gtest cmake來生成.lib而不是.a

有很多事情,我可以嘗試完成移植此cmake文件,我不知道從哪裏開始,這種缺乏理解正在殺死我。我覺得如果我理解了這一點,那麼我可以做出一個更好的決定。

Cygwin gcc手冊頁意味着-lLibName查找要鏈接的文件libLibName.a。與Linux相同。大。那麼爲什麼VendorLib.lib鏈接到? (所有的跡象表明,它鏈接,因爲我有鏈接錯誤消失,一旦我得到cmake正確搜索和找到庫。)

如果最好的解釋是鏈接到正確的文檔,我會接受作爲答案。如果是這樣,我就找不到文檔。 TIA SO用戶!

更新:

配置cmake的使用64位Linux庫,我從C進行下面的消息輸出:

-- Found Ballard library /usr/local/lib64/ballard/libbtiCard.so 
-- Found Ballard library /usr/local/lib64/ballard/libbti1553.so 

而且從做如下:

/usr/local/lib64/ballard/libbtiCard.so: error adding symbols: File in wrong format 
collect2: error: ld returned 1 exit status 

編譯Windows .lib靜態庫時,我不會收到此錯誤消息。重命名從.so.dll.a並沒有改變任何東西。

我不需要Cygwin的特殊版本,對嗎?這僅僅是供應商圖書館的問題,而不是Cygwin,我需要與他們解決問題?

最後更新

我複製我的供應商的WIN64/VENDOR.LIB到/usr/local/lib64/vendor/libVendor.a。

我複製我的供應商的Linux的/ API64/*。h至/usr/local/include/vendor/*.h

我還添加以下行到我的cmake的文件,所以它會搜索lib64目錄/路徑:

set_property(GLOBAL PROPERTY FIND_LIBRARY_USE_LIB64_PATHS TRUE) 

然後移至編譯谷歌測試/從/ usr /本地/ lib中模擬庫到/ usr /本地/ lib64下。還有其他與我不得不改變的這個問題無關的事情,但這些都在其他SO問題中都有涉及。多麼棒的社區!

+0

看起來像有一些有趣的東西在引擎蓋下運行。我認爲他們保留了.a和.so擴展名以實現makefile的兼容性。但最終它是所有x86彙編程序和Window的本機exe格式。 – yacc

+0

那麼我需要重命名Windows庫,以便它們具有.a擴展名? – PfunnyGuy

+0

我認爲這只是重命名而已。 .a和.dll.a都有這個'! '序言和.dll.a看起來不像嵌入任何dll。 (例如libssp.dll.a) – yacc

回答

3

在Cygwin的導入庫被命名爲

libName.a的靜態版本
libNAME.dll.a共享版本

包含報頭和導入庫的包名爲 {LIB} NAME- devel的。

作爲例子:

$ cygcheck -cd |grep glpk 
glpk         4.63-1 
libglpk-devel       4.63-1 
libglpk40        4.63-1 

$ cygcheck -l libglpk-devel |grep usr/lib 
/usr/lib/libglpk.dll.a 

$ cygcheck -l libglpk40 
/usr/bin/cygglpk-40.dll 

所以libglpk-devel包中包含的共享導入庫libglpk.dll.a。 被其他程序使用相應的共享庫是cygglpk-40.dll

導入庫調用NAME.lib是窗口中的一個,你不應該混合或建立一個cygwin程序時使用它們。

+0

我發現這個SO問題更流光了:[用Cygwin下的cmake編譯庫](https://stackoverflow.com/questions/3763212/compiling-libraries-with-cmake-under-cygwin?rq=1)。我開始認爲我之前所做的是正確的,只是錯誤地命名了文件,並且我的gtest編譯是導致我的鏈接錯誤的真正原因。 – PfunnyGuy

+0

這個答案几乎可以回答我的問題,雖然我的問題沒有完全解決。但它確實允許我做一些更多的實驗,意識到Windows庫是我需要的,並且可以看到gtest未找到,因爲我的鏈接器搜索路徑不完整。一旦我得到了這一切,我會發布我的最終結果作爲問題編輯。謝謝@matzeri! – PfunnyGuy