我在 Manjaro GNU/Linux 上使用 IUP,我正在尝试编译来自 this site 的第一个示例程序.但是,编译器说它找不到 iup.h
。我使用 yaourt 安装了 IUP,安装了名为 iup-all-bin
的包。
我应该将 iup.h
的 #include
指令更改为什么?
编辑:感谢其中一条评论,我能够找到头文件和库文件(我想!),但现在,我从 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
),但是当您安装非标准库时,您可能需要告诉编译器在其他地方可以查找包含文件,但在其他地方找不到。这就是 -I
标志出现的地方。如果 iup.h
存在于 /usr/include/iup-3.7
中,您可以添加 -I/usr/include/iup-3.7
编译器会在 /usr/include
中找不到 iup.h
后寻找.作为帽子戏法,您可能会发现有趣的是,由于 /usr/include/iup-3.7
是 /usr/include
的子目录,您只需更改 #include
指令,如果你想:
#include <iup-3.7/iup.h>
但如果它不总是在 iup-3.7
子目录中,这可能会很脆弱。
现在你的编译器已经完成将 C 文件编译成一个目标文件,它包含你所有的机器代码逻辑,但是有未解析的函数引用,比如 IupOpen
,所以它不能运行还好。为了能够运行它,您必须将程序的目标文件链接在一起,希望其他文件中定义的函数满足您文件中的引用。
默认情况下,gcc
将链接到 C 标准库中,使您可以访问 printf
和 exit
等函数。但是当你从外部库引用函数时,你必须告诉它你想将它链接到你的程序中并解析这些引用。您可以使用 -l
执行此操作。
最后,我要注意 -l
也使用搜索路径。与添加到包含路径的 -I
一样,-L
添加到库搜索路径。如果您的库位于非标准位置,则除了 -l
标志之外,您还必须包含一个 -L
标志来告诉链接器在哪里可以找到该库告诉链接器您想要引用特定的库。
关于c - C 中的 IUP - 教程无法编译,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24462636/