【问题标题】:Getting unusual error while compiling the C code [duplicate]编译C代码时出现异常错误[重复]
【发布时间】:2019-01-15 13:50:16
【问题描述】:
  • 我已经构建了 zeroMQ 解决方案,即 libzmq 和 czmq,我使用 cmake-3.13 配置和生成,而 vs 2015 为我的 Windows 10 系统构建解决方案。
  • 我能够成功运行 czmq_selftest.exe,但是当我尝试运行示例代码时出现以下错误-

这是我的目录结构-

C:\Program Files\czmq\examples\security\hello.c C:\Program Files\czmq\include

你好.c

#include <czmq.h>

int main (void) {
    zsock_t *publisher = zsock_new (ZMQ_PUB);
    zsock_set_curve_server (publisher, true);
    puts ("Hello, Curve!");
    zsock_destroy(&publisher);
    return 0;
}

我正在使用“MinGW64”来编译上述代码-

最初上面的代码给了我

$ gcc hello.c -o 你好 hello.c:5:10:致命错误:czmq.h:没有这样的文件或目录

虽然我尝试手动给出我得到的头文件路径-

gcc hello.c -o hello -I "C:\Program Files\czmq\include"

C:\Ruby25-x64\msys64\tmp\ccF5oCT1.o:hello.c:(.text+0x22): undefined reference to `__imp_zsock_new_checked'
C:\Ruby25-x64\msys64\tmp\ccF5oCT1.o:hello.c:(.text+0x3b): undefined reference to `__imp_zsock_set_curve_server'
C:\Ruby25-x64\msys64\tmp\ccF5oCT1.o:hello.c:(.text+0x64): undefined reference to `__imp_zsock_destroy_checked'
collect2.exe: error: ld returned 1 exit status

我找不到任何可以帮助我解决此错误的信息。

【问题讨论】:

  • 我不清楚cmake 的来源。你是说你用它来构建和安装 zeroMQ 吗?您似乎没有将它与您正在尝试构建的测试程序一起使用,但我不确定。
  • 最后报的错误是link错误,只有C编译成功才会得到。 IOW,你的-I 选项做了你想做的事。但是您还需要告诉链接器在哪里查找相应的库文件。在gcc 和许多其他系统中,该角色由-L 选项填充。
  • @JohnBollinger 我已经下载了 ZeroMQ 的二进制文件并使用 CMake 进行了配置和生成,然后我使用 Visual Studio 2015 SDK 8.1 x64 构建了 .sln。我试过上面的命令$ gcc hello.c -o hello -I "C:\ZeroMQ\czmq\include" -L "C:\ZeroMQ\czmq\builds\cmake\Debug\libczmq.lib"我仍然得到同样的错误-C:\Ruby25-x64\msys64\tmp\ccjNjDFn.o:hello.c:(.text+0x22): undefined reference to __imp_zsock_new_checked'
  • -L directory 选项告诉链接器在directory 中搜索您告诉它链接的库。它没有告诉它链接任何库。 -l name 选项可以做到这一点。告诉它在哪里搜索链接什么库:-L C:\ZeroMQ\czmq\builds\cmake\Debug -lczmq
  • @MikeKinghan 是的,后来我使用了 msi 安装程序并修复了缺少库的问题,只需在 PATH 变量中添加引用并将一些 dll 复制到 system32。我没有使用安装程序获得链接问题,所以二进制文件可能存在一些问题..

标签: c windows gcc zeromq mingw-w64


【解决方案1】:

你应该像这样改变第一行:

#include "path/czmq.h"

这是告诉 C 包含文件在不同目录中的方法

如果包含文件在同一目录中,则该行变为

#include "czmq.h"

第二个错误恕我直言,意味着您在包含文件中没有正确的定义

【讨论】:

  • 我的反对意见不足以投反对票,但不,不是真的。在#include 指令中指定(相对)路径仅在路径是包含的标头的众所周知的特征时才有意义。它适合适应不同的接头安装位置。对于后者,人们希望使用编译器选项来指定要检查的其他目录,正如 OP 已经描述的那样。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-04
  • 1970-01-01
  • 1970-01-01
  • 2012-03-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多