关于图书馆如何在C

时间:2015-06-27 01:41:04

标签: c glib

我是一名学习C的新手学生,希望将gLib库函数用于项目:http://www.linuxfromscratch.org/blfs/view/svn/general/glib2.html (我正在使用Ubuntu)

我有几个关于库如何在C中工作以及安装或使用它时会发生什么的问题:

  1. 当我安装它时(在文件夹中运行./configure&& make&& make install),它到底在做什么?根据我的学习,C中有共享库,C中有静态库。它是否正在安装库并将文件包含到/ usr / lib /或某处?

  2. 将gcc与外部库一起使用时,必须指定-L和-I标志以指定查找库和头文件的位置。当我安装glib时,是否需要指定这些标志?

  3. 如果我想将我的可执行文件打包到另一台机器上,如果其他机器没有glib会怎么样?我想如果我有静态库,我可以将它包含在二进制文件中,但它如何适用于glib?

3 个答案:

答案 0 :(得分:2)

我熟悉使用GTK +和GLIB进行开发。因为我知道库文件驻留在/ usr / lib中,并且包含文件位于/ usr / include中。某些库可能位于/ usr / local / lib等位置。我会尽力回答你的问题。

  1. 通过源包安装库是的,它将文件安装到各个文件夹/ usr / share / usr / lib / usr / include等。强烈建议您使用您的发行版&#39 ; s包管理器安装库包和开发头。从源安装总是会失败,因为可能需要依赖。

  2. 这就是autogen和makefile等工具派上用场的地方。你不一定需要关心自己指定所有这些。 pkg-config等工具处理所有工作。大多数库都会将软件包配置文件安装到/ usr / lib / pkgconfig& / usr / share / pkgconfig目录。这有助于任何开发应用程序的人轻松地将他们的代码链接到库。

  3. 使用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
    1. 我认为这是一个很好的关注便携性。没有一个静态库可以跨平台。必须手动为这些平台编译。我想要摆脱你将使用GNOME软件基础开发的Anjuta IDE的所有麻烦。它使得开发GLIB& GTK +应用程序轻而易举地支持C& C ++。它将创建$ apt-get install libgtk-3-dev Makefile和其他文件,以便在跨平台上轻松开发代码并简化部署。我可以链接你一些资源,但我在堆栈溢出上的声誉小于10.所以我只会提到下面一些资源的名称。
    2. 进一步阅读

      Makefile教程

      Anjuta IDE(C / C ++)):: //anjuta.org/

      GTK + -3.0 Hello World,使用pkg-config进行编译和链接:

答案 1 :(得分:1)

  1. 关于configuremakemake installconfigure是一个shell脚本,用于发现(和配置)您的开发环境。 makemake install是构建软件的便捷方式。其中make通常涉及编译和链接,其中make install通常涉及将可执行文件和库复制到标准路径并设置事物(如果通常包含/usr/include中的文件也包含在内),这样你就不会在运行可执行文件之前必须显式提供路径。 make可以手动完成,但它非常麻烦。

  2. 对于glibc - 是的,你必须指定那些标志。通常,所有库在大多数平台上都会有两种版本。二进制形式用于在实际加载程序时进行动态链接。此外 - 大多数发行版都有这些库的-dev-devel版本。这些是构建使用这些库的软件所必需的(上面的configure可以帮助确定是否安装了devel库)。通常,当您看到安装了库而不是它的开发时 - 您可能会看到configure错误。简而言之,如果要与这些库链接,则需要devel个版本。如果您使用make and make install从源代码构建库,则不需要执行此步骤。

  3. 如果要将可执行文件打包到另一台计算机上,并且您不确定是否存在其他glib,或者您希望确保要安装的glib应该是一个特定的您想要的版本,您应该在构建(编译/链接)库时静态链接。 this gcc man page已获得有关链接选项的若干详细信息。我相信应该有一种静态链接glib(或glib2)的方法。虽然如果您已经有足够的应用程序使用它,通常可能不需要。

答案 2 :(得分:1)

  

当我安装它时(运行./configure&& make&& make install inside   文件夹),究竟是做什么的?从我学到的东西   C中的共享库和C中的静态库。它是真的吗?   将文件和包含文件安装到/ usr / lib /或某处?

它首先运行./configure然后如果成功则运行make,如果成功则运行make installconfigure是一个处理系统之间许多兼容性问题的脚本。它们通常是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可能有帮助。

相关问题