我在Manjaro GNU/Linux上使用IUP,并试图编译this site中的第一个示例程序。但是,编译器说它找不到iup.h。我使用yaourt安装了IUP,安装了名为iup-all-bin的包。
我应该将#includeiup.h指令更改为什么?
编辑:感谢其中一条评论,我找到了头文件和库文件(我想!),但现在,我从GCC得到这个错误:

$gcc hello0.c -I/usr/include/iup-3.7/ -L/usr/lib -o hello0
/tmp/ccMAbPwz.o: In function `main':
hello0.c:(.text+0x1e): undefined reference to `IupOpen'
hello0.c:(.text+0x28): undefined reference to `IupLabel'
hello0.c:(.text+0x30): undefined reference to `IupDialog'
hello0.c:(.text+0x38): undefined reference to `IupShow'
hello0.c:(.text+0x3d): undefined reference to `IupMainLoop'
hello0.c:(.text+0x42): undefined reference to `IupClose'
collect2: error: ld returned 1 exit status

我知道libiup.so(以及所有非Lua库)都在/usr/lib中,并且头文件在/usr/include/iup-3.7

最佳答案

您可能知道,也可能不知道,从源代码到可执行文件需要两个步骤:编译和链接。(每个步骤本身都有步骤,但与讨论无关。)
当包含#include的文件时:

#include <iup.h>
#include <stdlib.h>
/* ... */

iup.hstdlib.h不会凭空出现。它们是真实的文件名,编译器需要知道在哪里找到它们,以便能够尽职地包含和处理它们。stdlib.h在默认情况下编译器将查找的某个目录(通常是/usr/include)中,但在安装非标准库时,可能需要告诉编译器在其他位置可以查找include文件,但在其他位置找不到它。这就是-I标志的来源。如果iup.h存在于/usr/include/iup-3.7,则可以在-I/usr/include/iup-3.7上进行编译,编译器将在iup.h中找不到/usr/include。作为一个帽子戏法,您可能会发现有趣的是,由于/usr/include/iup-3.7/usr/include的一个子目录,因此如果您想:
#include <iup-3.7/iup.h>

但如果它不总是在#include子目录中,则可能很脆弱。
现在编译器已经完成了将C文件编译成一个对象文件,该对象文件包含机器代码中的所有逻辑,但对iup-3.7之类的函数有未解析的引用,因此它还不能运行。为了能够运行它,必须将程序的对象文件链接在一起,希望其他文件中定义的函数满足文件中的引用。
默认情况下,IupOpen将链接到C标准库,允许您访问gccprintf等函数。但是当你从外部库中引用函数时,你必须告诉它你想把它链接到你的程序中并解析那些引用。您可以使用exit来执行此操作。
最后,我应该注意到-l也使用搜索路径。与添加到包含路径的-l一样,-I添加到库搜索路径。如果您的库位于非标准的地方,则除了-L标志之外,还必须包含-L标志来告诉链接器在哪里找到库,以告诉链接器您要引用特定库。

关于c - C中的IUP-教程无法编译,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/24462636/

10-10 20:57