C 程序在 Netbeans 中编译,但不在 cmd 中使用 gcc 编译

C program compiling in Netbeans, but not compiling in cmd with gcc

我有一个 C 程序,并且一直在尝试将 http://libmodbus.org/ 添加到我的项目中。我是 C 的新手,但痛苦地发现我的方式足以 ./configure && make install 以及创建库所需的一切。 现在,我已经从这个 link https://forums.netbeans.org/ptopic29782.html

添加了头文件的位置和我的 libmodbus.dll.a 文件的位置

现在,我在 netbeans 中编译我的程序,它编译得很好,但是当我尝试 运行 程序时,我收到 undefined reference to modbus_new_rtu

当我尝试像这样在 cmd 中编译 main.c 文件本身时

C:\Users\Jensen Home PC\Documents\NetBeansProjects\Modbus_Project>gcc main.c

我收到

main.c:4:20: fatal error: modbus.h: No such file or directory 

如果相关或有帮助, 这是我的头文件的路径

C:\MinGW\msys.0\local\include\modbus

和我的 libmodbus.dll.a 文件,(当我在 netbeans 中添加它时,我只提供文件夹 C:\MinGW\msys.0\local\lib 因为它不让我 select 一个文件而只提供一个文件夹)

C:\MinGW\msys.0\local\lib\libmodbus.dll.a

那么这里的问题是什么?我已经研究了很多关于 SO 的未定义参考问题,但它似乎并没有解释为什么我不能用 gcc 编译。看起来我得到了一个未定义的引用,因为我的 #include <modbus.h> 实际上并没有首先包含该文件,但出于某种原因 Netbeans 认为我有,所以当 Netbeans 找不到该方法时,它说未定义。

我该如何解决这个问题?

非常感谢任何帮助。谢谢! -狄龙

这里有两个不同的问题。

创建可执行文件就像您尝试从源代码创建一样有两个阶段 - 第一个阶段称为编译,第二个阶段称为 linking。很多时候我们把整个过程称为编译,但你真正编译你必须在更高的分辨率下理解它。

  • No such file or directory是编译错误,是编译命令中没有提到include目录造成的。您自己说过,丢失的头文件所在的目录与编译目录不同。使用选项 -I 后跟该目录的路径。 它可能不会发生在 Netbeans 中,因为 IDE 有自己的默认(但通常是可配置的)定义,当他们编译你的代码时,look/include 文件的目录。
  • undefined reference 是一个 linker 错误。当您在您的代码中引用在另一个源文件或库中定义的某个元素 (variable/function/struct),但 link 用户找不到此定义时,就会发生这种情况。你的代码和这个库应该 link。使用 gcc 选项 -l 后跟该目录的路径。

关于问题中的最后一段 - 重要的是要了解 #include <modbus.h>undefined reference 无关。包括在 编译时 检查。在linking 时间 发现未定义的引用,这仅在成功的编译阶段之后出现。

阅读有关编译的更多信息并link更好地理解。

关于 gcc 的 nice tutorial