【问题标题】:linking library for creating static library用于创建静态库的链接库
【发布时间】:2012-09-02 11:32:44
【问题描述】:

我在 Lib_file.h 和 Lib_file.cpp 中编写了一些代码。我希望将此代码转换为静态库。我能够编译代码(使用命令g++ -I <necessary include files> -o Lib_file.o Lib_file.cpp)来获取Lib_file.o。我还可以使用ar rvs Lib_file.a Lib_file.o 命令将其添加到存档中。现在,当我尝试使用 -L 选项在其他代码中使用这个库时,我得到未定义的引用错误。此错误指向我的 Lib_file.o 中的代码。所以我的问题是如何让我的 Lib_file.cpp 中的代码链接到它使用的库。

到目前为止,我已经尝试了以下选项

我。创建 Lib_file.o 后,我尝试了以下命令 g++ -L<include path> -l<.a files> Lib_file.o 。在执行此命令时,我收到以下错误

/usr/lib/../lib64/crt1.o:在函数“_start”中: init.c:(.text+0x20): undefined reference to `main' collect2: ld 返回 1 个退出状态

二。我尝试使用 ar 命令将所有必要的 .a 文件与我的 Lib_file.o 一起包含在新存档中。当我尝试将 Lib_file.a 库与我的应用程序一起使用时,我仍然收到未定义的引用错误

请帮帮我

【问题讨论】:

  • 我强烈建议制作共享库,而不是静态库。见stackoverflow.com/a/12197285/841108
  • 在 Linux 上,.a 文件只是一个包含一堆 .o 文件(已编译但未链接)的便捷存档。它没有元数据。与 .a 文件链接基本上与单独与 .o 文件链接相同。至于 .o 文件,.a 文件没有办法指明它们的外部依赖库。您需要在构建系统中单独跟踪它,并在链接时将信息提供给链接器。
  • @BasileStarynkevitch :感谢您的有用帖子

标签: c++ linux g++ unix-ar


【解决方案1】:

首先,所有库通常都命名为 libxyz.a,其中 xyz 是库的名称。

其次,您尝试仅使用您用于库的目标文件创建程序,并将其与自身链接。这当然行不通,因为库没有正常程序所需的main 函数。您必须创建另一个程序,并将 那个 与库链接。

喜欢

gcc myotherprogram.c -o myotherprogram -L/some/path -lxyz

正如您在上面的命令行中看到的那样,我将库 last 放在了命令行上。这是必需的,因为链接器以相反的顺序查找依赖项。

编辑:将您的静态库与其他库链接:您不需要。静态库是完全独立的,如果它需要其他库本身来工作,那么它们必须在编译实际程序时出现在命令行中。

例如,假设库 xyz 依赖于标准数学库(即 m 库)。在创建xyz 库时,您不能“链接”它,因为您实际上并没有链接 静态库,您只需将一组目标文件放在一个存档中(ar.a 扩展名用于存档)。当您构建需要 xyz 库的实际应用程序时,您还需要链接到 xyz 需要的任何库:

gcc myotherprogram.c -o myotherprogram -L/some/path -lxyz -lm

【讨论】:

  • 我想我的问题可能不清楚。我面临的问题是,当我执行您给出的命令行时,我使用 -l 链接的库中的代码出现未定义的引用错误。我的问题是,对于库代码 libxyz.cpp,如果它正在使用其他一些库,那么我如何将这些库链接到这个库。
  • @MananShah 在编译完成的程序时,您需要添加库所需的所有库。更新了答案以反映这一点。
猜你喜欢
  • 1970-01-01
  • 2021-09-30
  • 1970-01-01
  • 2013-07-07
  • 1970-01-01
  • 1970-01-01
  • 2013-10-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多