我有一个 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/