2017-06-01 148 views
0

我有一个C程序,并试图将http://libmodbus.org/添加到我的项目中。我是C新手,但痛苦地找到了足够的方法./configure & &使安装和创建库所需的一切。 现在,我已经从这个链接加到我的libmodbus.dll.a文件的头文件和位置的位置https://forums.netbeans.org/ptopic29782.html在Netbeans中编译C程序,但不能用cmcc编译gcc

现在,我编译我的程序在NetBeans中,它编译罚款,但是当我尝试运行程序,我收到undefined reference to modbus_new_rtu

当我尝试编译main.c文件只是自己在cmd中这样

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无法找到该方法时,它说没有定义。

我该如何解决这个问题?

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

回答

1

这里有两个独立的问题。

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

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

关于你的问题你的最后一段 - 要明白#include <modbus.h>无关与undefined reference是很重要的。包括被检查在编译时间。在链接时间找到未定义的参考,只有在编译阶段成功后才会提供。

阅读更多关于编译和链接以更好地理解。

A nice tutorial about gcc。