C程序在Netbeans中编译,但在cmd中用gcc无法编译

标签 c gcc netbeans undefined-reference modbus

我有一个 C 程序,一直在尝试添加 http://libmodbus.org/进入我的项目。我是 C 语言的新手,但痛苦地找到了足够的方法来 ./configure && make install 以及创建库所需的所有其他内容。 现在,我已从此链接 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\1.0\local\include\modbus

和我的 libmodbus.dll.a 文件(当我将其添加到 netbeans 中时,我只提供文件夹 C:\MinGW\msys\1.0\local\lib 因为它不允许我选择文件,而只能选择文件夹)

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

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

如何解决这个问题?

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

最佳答案

这里有两个独立的问题。

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

  • No such file or directory是一个编译错误,是由于在编译命令中没有提及 include 目录造成的。您自己说过,缺少的头文件所在的目录与编译目录不同。使用选项-I接下来是该目录的路径。 在 Netbeans 中可能不会发生这种情况,因为 IDE 对于编译代码时要查找/包含文件的目录有自己的默认(但通常是可配置的)定义。
  • undefined reference是一个链接器错误。当您在代码中引用另一个源文件或库中定义的某个元素(变量/函数/结构),但链接器找不到该定义时,就会发生这种情况。您的代码和这个库应该链接。使用 gcc 选项 -l后跟该目录的路径。

关于问题中的最后一段 - 重要的是要了解 #include <modbus.h>undefined reference 无关。包含在编译时进行检查。在链接时发现 undefined reference ,只有在成功编译阶段之后才会出现。

阅读有关编译和链接的更多信息以更好地理解。

一个nice tutorial关于海湾合作委员会。

关于C程序在Netbeans中编译,但在cmd中用gcc无法编译,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44297021/

相关文章:

java - 事件处理程序,定义和访问参数(java Swing Netbeans)

C chars 和 char* 指针的索引

c - 如何接受第一次迭代的一个输入?

c - 将10位映射到10字节char数组

linux - 当存在同名的共享库时,如何强制链接静态库

c - GCC错误结构灵活数组成员没有命名成员

java - 线程 "main"java.lang.ClassFormatError : 中的异常

c - 偏移指针的正确方法是什么?

c++ - 我的 is_complete 类型特征的实现是否暴露了编译器错误?

java - log4j 在 Netbeans 中使用不正确的属性文件