【发布时间】: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 上运行。