我正在使用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问题中。多么棒的社区!
答案 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程序时不应混用或使用它们。