我是一名学习C的新手学生,希望将gLib库函数用于项目:http://www.linuxfromscratch.org/blfs/view/svn/general/glib2.html (我正在使用Ubuntu)
我有几个关于库如何在C中工作以及安装或使用它时会发生什么的问题:
当我安装它时(在文件夹中运行./configure&& make&& make install),它到底在做什么?根据我的学习,C中有共享库,C中有静态库。它是否正在安装库并将文件包含到/ usr / lib /或某处?
将gcc与外部库一起使用时,必须指定-L和-I标志以指定查找库和头文件的位置。当我安装glib时,是否需要指定这些标志?
如果我想将我的可执行文件打包到另一台机器上,如果其他机器没有glib会怎么样?我想如果我有静态库,我可以将它包含在二进制文件中,但它如何适用于glib?
答案 0 :(得分:2)
我熟悉使用GTK +和GLIB进行开发。因为我知道库文件驻留在/ usr / lib中,并且包含文件位于/ usr / include中。某些库可能位于/ usr / local / lib等位置。我会尽力回答你的问题。
通过源包安装库是的,它将文件安装到各个文件夹/ usr / share / usr / lib / usr / include等。强烈建议您使用您的发行版&#39 ; s包管理器安装库包和开发头。从源安装总是会失败,因为可能需要依赖。
这就是autogen和makefile等工具派上用场的地方。你不一定需要关心自己指定所有这些。 pkg-config
等工具处理所有工作。大多数库都会将软件包配置文件安装到/ usr / lib / pkgconfig& / usr / share / pkgconfig目录。这有助于任何开发应用程序的人轻松地将他们的代码链接到库。
使用package config获取配置:
$ pkg-config --cflags --libs glib-2.0
-I/usr/include/glib-2.0 -I/usr/lib/x86_64-linux-gnu/glib-2.0/include -lglib-2.0
使用GCC和&链接包配置:
$gcc example.c `pkg-config --cflags --libs gtk+2.0 glib-2.0` -o example
以上命令会将我的程序与gtk&油嘴。
使用Makefile不必再次输入这些长行:
生成文件:
OBJS = main.o callbacks.o
CFLAGS = `pkg-config --cflags --libs gtk+-2.0`
program: $(OBJS)
gcc -o program $(OBJS)
main.o: main.c
gcc -c main.c $(FLAGS)
callbacks.o: callbacks.c callbacks.h
gcc -c callbacks.c $(FLAGS)
.PHONY : clean
clean:
rm *.o
rm program
.PHONY : install
install:
cp program /usr/bin
.PHONY : uninstall
uninstall:
rm /usr/bin/program
上面的makefile是一个简单的GTK + 2.0应用程序,你可以通过CFLAGS
中的包装配置来判断程序是否可执行,只需要在源目录中输入{{1} }。 pkg-config仅在您安装了要使用的库的开发包时才有效。要让ubuntu安装GTK + -3.0和GLIB开发文件,请输入:
make
$ apt-get install libgtk-3-dev
,Makefile
和其他文件,以便在跨平台上轻松开发代码并简化部署。我可以链接你一些资源,但我在堆栈溢出上的声誉小于10.所以我只会提到下面一些资源的名称。Makefile教程
Anjuta IDE(C / C ++)):: //anjuta.org/
GTK + -3.0 Hello World,使用pkg-config进行编译和链接:
答案 1 :(得分:1)
关于configure
,make
和make install
。 configure
是一个shell脚本,用于发现(和配置)您的开发环境。 make
和make install
是构建软件的便捷方式。其中make
通常涉及编译和链接,其中make install通常涉及将可执行文件和库复制到标准路径并设置事物(如果通常包含/usr/include
中的文件也包含在内),这样你就不会在运行可执行文件之前必须显式提供路径。 make
可以手动完成,但它非常麻烦。
对于glibc - 是的,你必须指定那些标志。通常,所有库在大多数平台上都会有两种版本。二进制形式用于在实际加载程序时进行动态链接。此外 - 大多数发行版都有这些库的-dev
或-devel
版本。这些是构建使用这些库的软件所必需的(上面的configure
可以帮助确定是否安装了devel库)。通常,当您看到安装了库而不是它的开发时 - 您可能会看到configure
错误。简而言之,如果要与这些库链接,则需要devel
个版本。如果您使用make and make install
从源代码构建库,则不需要执行此步骤。
如果要将可执行文件打包到另一台计算机上,并且您不确定是否存在其他glib
,或者您希望确保要安装的glib
应该是一个特定的您想要的版本,您应该在构建(编译/链接)库时静态链接。 this gcc man page已获得有关链接选项的若干详细信息。我相信应该有一种静态链接glib(或glib2)的方法。虽然如果您已经有足够的应用程序使用它,通常可能不需要。
答案 2 :(得分:1)
当我安装它时(运行./configure&& make&& make install inside 文件夹),究竟是做什么的?从我学到的东西 C中的共享库和C中的静态库。它是真的吗? 将文件和包含文件安装到/ usr / lib /或某处?
它首先运行./configure
然后如果成功则运行make
,如果成功则运行make install
。 configure
是一个处理系统之间许多兼容性问题的脚本。它们通常是shell脚本,因为这是跨系统的共同点,因此configure脚本可以在各种系统中运行。 configure
所做的一件事就是创建一个Makefile。第二个命令make
将使用新创建的Makefile来构建库或可执行文件。由于您未指定目标(就像您将在make install
中),make
将构建默认目标,通常是all
目标。这只是按惯例。 Makefile基本上是要构建的东西(目标)以及它们依赖的东西(依赖项)以及如何构建到目标(规则)的列表。最后,make install
实际上将安装必要的组件。对于库,这是可执行文件的库和必要的头文件,它只是程序。也可能会安装man pages。安装库的位置取决于您指定安装它们的位置。通常configure
将使用--prefix
参数来控制它们的安装位置。如果您不使用--prefix
,则很可能会安装在系统的默认位置。
将gcc与外部库一起使用时,必须指定-L和-I 标志,用于指定查找库和头文件的位置。当我 安装glib,我需要指定这些标志吗?
你的问题有点不清楚,所以让我先确定一下。您是否在询问安装glib后是否需要使用-L和-I告诉gcc在哪里查找?如果是这样,这取决于您安装它们的位置。通常,在制作和安装库时,您将在默认位置安装库和头文件。如果你这样做,假设你的gcc配置正确,那么你不会。如果您没有,那么您很可能必须使用-L
和-I
如果我想将我的可执行文件打包到另一台机器上,那会是什么 如果其他机器没有油嘴,会发生什么?我想如果我有静电 库我可以将它包含在二进制文件中,但是如何 它对glib有用吗?
如果它没有glib并且您使用了共享库,那么您的应用程序将无法运行。您需要在另一台计算机上具有相同版本的glib库,或者静态构建库。如何在统计上构建它们取决于库。 This SO question可能有帮助。