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

3
我有两个程序相互通信:“服务器”是在Linux上用GO编写的,而“客户端”是在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文件来编译Windows x64架构的程序。但是,为了运行程序,需要将*.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 安装程序安装的,而不是从源代码编译安装的。

如何在 Windows 上编译而不使用 Visual Studio?


1
虽然这是MS-Windows而不是Linux,但我非常确定“-L”选项并不像你想的那样起作用。如果你阅读了gcc的MS-Windows版本的文档,它对“-L”选项有什么说明? - Sam Varshavchik
你必须使用g++编译.lib文件;不能将使用g++编译的代码链接到由MSVC编译的库中。这两种文件格式是不同的。 - M.M
此外,如果 DLL 是由 MSVC 编译的,则可能使用与 g++ 不同的 ABI。正确的方法是使用 g++ 从源代码重新构建 DLL。 - M.M
我也这么想,但我希望不必要。还是谢谢。 - wizir
1个回答

1

这不是链接库的正确方式。

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

你需要使用-l,并且它需要一个名称,而不是一个文件名。

所以:

-l lzmq-v120-mt-4_0_4

链接器应自动搜索具有适当前缀和适当扩展名的匹配文件(.so.a.lib或其他)以适配该平台。

(在先前的示例中,您已经正确地完成了此操作。)

请仔细阅读文档


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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接