1

我在 Manjaro GNU/Linux 上使用 IUP,我正在尝试从这个站点编译第一个示例程序。但是,编译器说它无法找到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

4

1 回答 1

4

您可能知道也可能不知道,从源代码到可执行文件需要两个步骤:编译和链接。(这些步骤中的每一个本身都有步骤,但它们与讨论无关。)

当您包含一个文件时#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,编译器将在找不到iup.hin后查找那里/usr/include。作为一个帽子戏法,您可能会发现有趣的是,因为它/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, 也使用搜索路径。Like-I添加到包含路径,-L添加到库搜索路径。如果您的库位于非标准位置,则除了告诉链接器您引用特定库-L的标志外,您还必须包含一个标志来告诉链接器在哪里可以找到该库。-l

于 2014-06-28T04:41:26.973 回答