C ++链接只是静态库的所需部分

时间:2011-12-06 10:35:29

标签: c++ static g++

我正在尝试将静态库的某些部分链接到使用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;
}

感谢。

2 个答案:

答案 0 :(得分:4)

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

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

答案 1 :(得分:0)

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

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

另请注意,我将库放在命令行的末尾。它可能不再需要了,但它曾经是链接器按照命令行上给出的顺序扫描输入文件,因此如果在使用它的对象文件之前在命令行上有一个库,则链接器退出无法找到符号的错误。