我有一个C程序,并且一直在尝试将http://libmodbus.org/添加到我的项目中。我是C的新手,但痛苦地找到了我的方式./configure&& make install以及创建库所需的一切。 现在,我已经从此链接添加了头文件的位置和我的libmodbus.dll.a文件的位置https://forums.netbeans.org/ptopic29782.html
现在,我在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编译。看起来我得到一个未定义的引用,因为我的#include <modbus.h>
实际上并不是首先包含该文件,但由于某种原因Netbeans认为我有,所以当Netbeans找不到该方法时,它表示未定义。
我该如何解决这个问题?
非常感谢任何帮助。谢谢! - 狄龙
答案 0 :(得分:1)
这里有两个不同的问题。
创建像你这样的可执行文件尝试从源代码创建有两个阶段 - 第一个叫做编译,第二个叫做链接。很多时候我们称整个过程只是编译,但你真的编译你必须以更高的分辨率来理解它。
No such file or directory
是编译错误,原因是未在编译命令中提及include目录。您自己说,缺少的头文件所在的目录与编译目录不同。使用选项-I
,后跟目录的路径。
它可能不会发生在Netbeans中,因为IDE在编译代码时有哪些目录可以查看/包含文件,从而有自己的默认(但通常是可配置的)定义。undefined reference
是链接器错误。当您在代码中引用在另一个源文件或库中定义的某个元素(变量/函数/结构)时,会发生这种情况,但链接器并未找到此定义。您的代码和此库应该链接。使用gcc选项-l
,后跟该目录的路径。关于您问题的最后一段 - 了解#include <modbus.h>
与undefined reference
无关,这一点非常重要。包含在编译时检查。未定义的引用位于链接时间,仅在成功编译阶段后才会出现。
阅读有关编译和链接的更多信息,以便更好地理解。
关于gcc的nice tutorial。