我在Manjaro GNU/Linux上使用IUP,并试图编译this site中的第一个示例程序。但是,编译器说它找不到iup.h
。我使用yaourt安装了IUP,安装了名为iup-all-bin
的包。
我应该将#include
的iup.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.h
和stdlib.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标准库,允许您访问gcc
和printf
等函数。但是当你从外部库中引用函数时,你必须告诉它你想把它链接到你的程序中并解析那些引用。您可以使用exit
来执行此操作。最后,我应该注意到
-l
也使用搜索路径。与添加到包含路径的-l
一样,-I
添加到库搜索路径。如果您的库位于非标准的地方,则除了-L
标志之外,还必须包含-L
标志来告诉链接器在哪里找到库,以告诉链接器您要引用特定库。关于c - C中的IUP-教程无法编译,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/24462636/