Cygwin gcc中应该使用哪些库类型?

时间:2017-09-15 21:23:52

标签: gcc cmake cygwin

我正在使用Cygwin 2.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仓库并将其构建并安装到/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库,我从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 test / mock库从/ usr / local / lib移到/ usr / local / lib64。还有其他与此问题无关的事情我不得不改变,但这些都包含在其他SO问题中。多么棒的社区!

1 个答案:

答案 0 :(得分:3)

在cygwin上,导入库名为

libNAME.a for static version
libNAME.dll.a for shared version

包含标头和导入库的包已命名 {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程序时不应混用或使用它们。