【问题标题】:Creating a project, from Makefile to static/dynamic libraries in UNIX创建项目,从 Makefile 到 UNIX 中的静态/动态库
【发布时间】:2010-10-10 13:57:23
【问题描述】:

伙计们,您能在 unix 上描述一些关于 c++ 构建块的事情吗?

我想创建一个链接到静态库和动态库 (.so) 的应用程序。

问题 1: 如何使用 gcc/g++ 创建静态库?如何使我的应用链接到它。

问题2: 如何在makefile中指定它,链接静态和动态库,假设两个库都有头文件

总结:多年来我一直在使用由其他人编写的 makefile 和库。因此,每次修改它,我只是简单地剪切和粘贴周围的东西,并没有真正理解它。现在我想深入了解构建/链接/创建 Makfile 的过程。

哪本好书详细地描述了这些概念?

谢谢

【问题讨论】:

    标签: c++ c makefile unix


    【解决方案1】:

    静态库通常使用ar 命令归档。构建所有目标文件后(最好使用 GCC 上的 -fPIC 开关),您可以像这样运行 ar

    ar -rs archivename.a list.o of.o objects.o
    

    man 页面描述了选项。

    动态库通常使用-shared 切换到gccld 以及带有.so 扩展名的输出文件名来构建。

    Autotools 使用libtool 程序处理这个问题。我不熟悉它的用途。

    可以通过使用-l (ell) 开关列出库(例如-lX 链接到libX.so)或直接使用绝对路径指定它们(例如添加@ 987654334@ 到您的命令)。通过在-l 之前指定-static.a 存档的适当绝对路径来链接静态库。

    【讨论】:

      【解决方案2】:

      用于创建由 foo.cpp、bar.cpp 中的代码组成的静态库的基本 Makefile:

      PROJECT = library.a
      OBJECTS = foo.o bar.o
      CFLAGS  = -Wall -pedantic
      
      all: $(PROJECT)
      
      .cpp.o:
              g++ -c $(CFLAGS) $<
      
      $(PROJECT): $(OBJECTS)
              libtool -o $(PROJECT) -static $(OBJECTS)
      

      静态链接到 library.a 的应用程序 baz.cpp 的基本 Makefile:

      PROJECT = baz
      CFLAGS  = -Wall -pedantic
      OBJECTS = baz.o
      
      all: $(PROJECT)
      
      .cpp.o:
              g++ -c $(CFLAGS) $<
      
      $(PROJECT): $(OBJECTS) library.a
              g++ $(OBJECTS) -L. -llibrary -o $(PROJECT)
      

      留下动态库,咳咳,作为给读者的练习。

      【讨论】:

      • 什么是 gcc 中的 -c 标志。头文件呢?
      • 另外,$
      • -c 表示编译但不链接。 $
      • 在第一个 Makefile 示例中,其中一个 CFLAGS 选项拼写错误“-pendantic”应该是“-pedantic”
      • 后缀规则已过时。 gnu.org/s/hello/manual/make/Suffix-Rules.html#Suffix-Rules 删除 .cpp.o: 目标,您将通过生成 .o 文件的隐式规则从 makefile 中获得相同的行为。
      【解决方案3】:

      答案 1:要从源文件 foo.c 和 bar.c 创建静态库,请执行以下操作:

      gcc -c foo.c
      gcc -c bar.c
      ar rc mylibrary.a foo.o bar.o
      

      有关这方面的更多信息,请阅读GCC manual 手册来学习如何使用编译器,以及通过编译器的链接器。这 binutils manual 也应该 乐于助人。

      答案 2:GNU Make manual 很漂亮 好的。要真正了解库及其工作原理,请阅读链接器和加载器 John R. Levine 的书。

      静态库非常简单,但共享库可能非常麻烦,具体取决于 在平台上以及您想要和需要的可移植性。例如,在 某些系统静态库和共享库必须使用不同的选项进行编译 正常工作(一个必须和另一个不能与位置无关编译 代码)。已经开发了整个实用程序框架以使这更容易(libtool), 但它们本身也不是没有问题的。

      【讨论】:

        【解决方案4】:

        由于您提到 gcc,我假设您使用的是 GNU Make。我为此找到的最佳文档是 official manual,它以易于理解的术语涵盖了您需要了解的所有内容。

        【讨论】:

          【解决方案5】:

          当我学习 Linux 编程时,Advanced Linux Programming 帮助了我很多。您可以查看this pdf 中的编写和使用库部分。它解释了很多关于 Linux 中的库。

          【讨论】:

          • 这是一本非常好的书,但我更喜欢与 makefile 结合使用的东西。
          【解决方案6】:

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2020-01-16
            • 2013-09-26
            • 2011-06-05
            • 1970-01-01
            • 2014-09-21
            • 2013-12-30
            • 1970-01-01
            相关资源
            最近更新 更多