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