【问题标题】:What library types are expected in Cygwin gcc?Cygwin gcc 中需要哪些库类型?
【发布时间】:2017-09-15 21:23:51
【问题描述】:

我使用的是 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/ 路径:

set_property( GLOBAL PROPERTY FIND_LIBRARY_USE_LIB64_PATHS TRUE )

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

【问题讨论】:

  • 看起来有一些有趣的东西在后台运行。我认为他们保留了 .a 和 .so 扩展名以实现 makefile 兼容性。但最终都是x86汇编和Window的原生exe格式。
  • 那么我是否需要重命名 Windows 库以使它们具有 .a 扩展名?
  • 我认为仅仅重命名并没有完成。 .a 和 .dll.a 都有 !<arch> 序言,而 .dll.a 看起来没有嵌入任何 dll。 (例如 libssp.dll.a)
  • libssp.dll.a 有大量对 cygssp-0.dll 的引用。我想它只是提供访问它的包装器。
  • 我敢打赌,有某种导入工具可以从 .dll 创建 .dll.a。 .so 文件是 ELF 格式,我怀疑这将在 Windows 上运行。

标签: gcc cmake cygwin


【解决方案1】:

在 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 程序时不应混合或使用它们。

【讨论】:

  • 我发现这个 SO 问题更能说明问题:Compiling Libraries with cmake under Cygwin。我开始认为我之前的内容是正确的,只是文件名称不正确,而我的 gtest 编译是导致链接错误的真正原因。
  • 这个答案几乎回答了我的问题,尽管我的问题还没有完全解决。但它确实允许我做更多的实验,意识到 Windows 库是我需要的库,并且我可以看到 gtest 没有找到,因为我的链接器搜索路径不完整。一旦我完成了所有工作,我会将我的最终结果作为问题编辑发布。谢谢@matzeri!
猜你喜欢
  • 2011-08-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-14
  • 1970-01-01
  • 1970-01-01
  • 2014-07-21
  • 1970-01-01
相关资源
最近更新 更多