我在Manjaro GNU/Linux上使用IUP,我正在尝试编译这个站点的第一个示例程序。但是,编译器说它找不到iup.h
。我使用yout安装了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
)中,但是当您安装非标准库时,可能需要告诉编译器它可以在其他地方查找它在其他地方找不到的包含文件。这就是-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
标志来告诉链接器在哪里找到这个库。