2017-09-15 61 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