【问题标题】:C++ Link only desired part of a static libraryC++ 仅链接静态库的所需部分
【发布时间】:2012-01-13 23:16:35
【问题描述】:

我正在尝试将静态库的某些部分链接到在 Linux 下使用 g++ 用 C++ 编写的程序中。

my_lib.h

#ifdef USE_EXTERN_LIB
# include <extern_lib.h>
void do_something (struct extern_lib);
#endif

void do_other (int);

my_lib.c

#include "my_lib.h"

#ifdef USE_EXTERN_LIB
void do_something (struct extern_lib l)
{
  // do something
}
#endif

void do_other (int a)
{
  // do something
}

我正在使用 -DUSE_EXTERN_LIB 预处理器标志静态创建 libmy_lib.a 以将所有内容都包含在其中。

但我想做的是创建两个程序:一个将这个库与 *extern_lib* 一起使用,另一个在没有 *extern_lib* 的情况下使用它,即:

g++ -L/path/to/lib -lmy_lib -o prog_wihtout_lib prog_without_lib.cc 
g++ -DUSE_EXTERN_LIB -L/path/to/lib -lmy_lib -o prog_with_lib prog_with_lib.cc

第二个程序编译但不是第一个,它说 extern_lib 未声明。

使用动态库没有问题,因为符号是在运行时加载的,但我想要一个静态库。 有没有办法只链接静态库的所需模块

编辑

prog_without_lib.cc

#include "my_lib.h"

int main ()
{
  do_other (42);

  return 0;
}

prog_with_lib.cc

#include "my_lib.h"

int main ()
{
  do_other (42);

  struct extern_lib l;
  do_something (l);

  return 0;
}

谢谢。

【问题讨论】:

  • 你能告诉我们“第二次”编译的确切错误吗?我将假设定义了USE_EXTERN_LIB 的第二种方法。
  • 你是 my_lib.c 中的#include "my_lib.h" 吗?
  • 对不起,这是第一个没有编译的程序
  • 你能贴出 prog_without_lib.cc 的源码吗?
  • 它会自动执行此操作。如果静态库中的函数未在可执行文件中使用,则不会从库中复制到可执行文件中。

标签: c++ static g++


【解决方案1】:

只需在库中链接,让链接器担心删除未使用的代码。这就是它的工作。

您尝试做的事情没有意义(不,在动态库中也没有任何意义。)定义仅在您编译库时才有效,并且您在第一行执行此操作。在第二行,您只需将已编译的库链接到您的可执行文件中。但实际上,静态库的全部意义在于它们对链接器可见,因此它可以(除其他外)去除任何未使用的代码。那么你为什么需要USE_EXTERN_LIB 定义呢?

【讨论】:

    【解决方案2】:

    在第二个命令行中构建时,必须将外部库添加到命令行:

    g++ -DUSE_EXTERN_LIB -I/path/to/external_lib/headers -o prog_wih_lib prog_with_lib.cc -L/path/to/external_lib/libfile -lexternal_lib -lmy_lib
    

    还请注意,我将库放在命令行的末尾。它可能不再需要了,但它曾经是链接器按照它们在命令行上给出的顺序扫描输入文件,所以如果一个库在目标文件使用它之前在命令行上,链接器退出提示找不到符号的错误。

    【讨论】:

      猜你喜欢
      • 2011-05-08
      • 1970-01-01
      • 1970-01-01
      • 2011-11-15
      • 1970-01-01
      • 2014-03-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多