Cygwin gcc中需要哪些库类型?

Cygwin gcc中需要哪些库类型?,gcc,cmake,cygwin,Gcc,Cmake,Cygwin,我正在使用Cygwin2.9.0-2,其中包括cmake 3.6.2。我正在尝试使用cmake 2.8运行在CentOS上开发的cmake文件。这是一个大型cmake文件,导入了各种库,并包括编译所有单元测试以再次运行gtest 我完全不了解cygwin gcc是否需要Windows或Linux库来链接输入,以及它产生了什么。我无法用谷歌搜索这个问题的答案:Cygwin是否希望在库中编译.a/.so或.lib/.dll文件,它是否创建了相同的文件,或者根本不关心。毕竟,它是在编译一个要在Wind

我正在使用Cygwin2.9.0-2,其中包括cmake 3.6.2。我正在尝试使用cmake 2.8运行在CentOS上开发的cmake文件。这是一个大型cmake文件,导入了各种库,并包括编译所有单元测试以再次运行gtest

我完全不了解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正确搜索和定位库,链接错误就会消失。)

如果最好的解释是链接到适当的文档,我会接受这个答案。如果是这样的话,我就是找不到文档。所以用户

更新:

将cmake配置为使用64位linux库,我从cmake获得以下消息输出:

-- Found Ballard library /usr/local/lib64/ballard/libbtiCard.so
-- Found Ballard library /usr/local/lib64/ballard/libbti1553.so
以及make的以下内容:

/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/path:

set_property( GLOBAL PROPERTY FIND_LIBRARY_USE_LIB64_PATHS TRUE )

然后将编译的google测试/模拟库从/usr/local/lib移动到/usr/local/lib64。还有一些与这个问题无关的事情我不得不改变,但这些都包含在其他SO问题中。多棒的社区啊

在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的导入库是windows one,在构建cygwin程序时不应混合使用它们

看起来引擎盖下面有一些有趣的东西。我认为他们保留了.a和.so扩展名以实现makefile兼容性。但最终都是x86汇编程序和Windows的原生exe格式。那么我需要重命名Windows库以便它们有一个.a扩展吗?我想这不仅仅是重命名。.a和.dll.a都有
序言和.dll.a看起来没有嵌入任何dll。(例如libssp.dll.a)libssp.dll.a有大量对cygssp-0.dll的引用。我猜它只是一个提供访问权限的包装器。我打赌有某种导入工具可以从.dll创建.dll.a。和.so文件是ELF格式的,我怀疑这会在Windows上运行。我发现这个问题更能说明问题:。我开始认为我之前所做的是正确的,只是命名错误的文件,我的gtest编译是我链接错误的真正原因。这个答案几乎回答了我的问题,尽管我的问题还没有完全解决。但它确实让我做了更多的实验,意识到Windows库是我需要的,并且我可以看到gtest找不到,因为我的链接器搜索路径不完整。一旦我把所有的问题都解决了,我会把我的最终结果作为一个问题编辑出来。谢谢@matzeri!