ZeroMQ 编译在 Windows 上使用 gcc/g++ 失败

Posted

技术标签:

【中文标题】ZeroMQ 编译在 Windows 上使用 gcc/g++ 失败【英文标题】:ZeroMQ compilation fails with gcc/g++ on windows 【发布时间】:2019-01-14 12:07:18 【问题描述】:

我有 2 个相互通信的程序:用 GO 编写的在 Linux 上运行的“服务器”和在 Windows 上用 c++ 编写的“客户端”。

我有 3 个文件: zmq.h libzmq-v120-mt-4_0_4.lib libzmq-v120-mt-4_0_4.dll

客户端是来自http://zguide.zeromq.org/c:hwclient 的示例,它可以在 linux 上使用命令行很好地编译:

g++ zmq.h client.cpp -lzmq

我可以使用 Visual Studio 并链接 *.lib 文件在具有 x64 架构的 Windows 上编译程序。不过,要运行程序,我需要将 *.dll 文件放在输出目录中,但这没关系。

问题是我不想使用 Visual Studio IDE 而是使用 gcc 或 g++。无论我尝试什么,我总是会遇到这些错误

C:\..\client>g++ zmq.h main.cpp -L libzmq-v120-mt-4_0_4.lib
..\ccQafArl.o:main.cpp:(.text+0x1c): undefined reference to `__imp_zmq_ctx_new'
..\ccQafArl.o:main.cpp:(.text+0x35): undefined reference to `__imp_zmq_socket'
..\ccQafArl.o:main.cpp:(.text+0x50): undefined reference to `__imp_zmq_connect'
..\ccQafArl.o:main.cpp:(.text+0x91): undefined reference to `__imp_zmq_send'
..\ccQafArl.o:main.cpp:(.text+0xb1): undefined reference to `__imp_zmq_recv'
..\ccQafArl.o:main.cpp:(.text+0xd8): undefined reference to `__imp_zmq_close'
..\ccQafArl.o:main.cpp:(.text+0xe8): undefined reference to `__imp_zmq_ctx_destroy'
collect2.exe: error: ld returned 1 exit status

看起来 g++ 找不到 *.lib 文件,但是 VS 如何编译没有错误?我每次都尝试过 TDM-GCC-32、TDM-GCC-64 和 mingw64 g++,结果相同。 ZeroMQ 是使用 windows 安装程序安装的,而不是从源代码安装的。

如何在不使用 Visual Studio 的情况下使其在 Windows 上编译?

【问题讨论】:

虽然这是 MS-Windows 而不是 Linux,但我很确定 -L 选项不会像您认为的那样做。如果您阅读了 gcc 的 MS-Windows 端口的文档,它会告诉您关于 -L 选项的什么信息? 您还必须使用 g++ 编译 .lib 文件;您不能将使用 g++ 编译的代码链接到由 MSVC 编译的库。文件格式不同 此外,如果 DLL 是由 MSVC 编译的,它可能使用与 g++ 不同的 ABI。正确的方法是使用 g++ 从源代码重建 DLL 我是这么认为的,但我希望没有必要。不过谢谢 【参考方案1】:

这不是你链接库的方式。

首先,您使用的是-L,它指定了库搜索路径,而不是库。

您正在寻找-l,这需要一个名称,而不是文件名。

所以:

-l lzmq-v120-mt-4_0_4

链接器应自动搜索具有该平台正确前缀和正确扩展名的匹配文件(.so.a.lib,等等)。

(你在前面的例子中是对的。)

阅读一下the documentation。

【讨论】:

好的,我刚才意识到了,但是使用“gcc zmq.h main.cpp -L . -l libzmq-v120-mt-4_0_4”我得到了一个新错误:libzmq-v120 -mt-4_0_4.lib:添加符号时出错:文件格式错误 collect2.exe:错误:ld 返回 1 个退出状态

以上是关于ZeroMQ 编译在 Windows 上使用 gcc/g++ 失败的主要内容,如果未能解决你的问题,请参考以下文章

如何在 C++ 中使用 ZeroMQ 通信多个图像?

zeromq学习记录C语言示例

zeromq编译与应用

win10编译ZeroMQ

如何在 Windows 7 中编译 NetHack?

centos8 安装ZeroMQ 使用 gozmq