c++链接只需要静态库的一部分

C++ Link only desired part of a static library

本文关键字:一部分 静态 链接 c++      更新时间:2023-10-16

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

我静态地创建libmy_lib。带有-DUSE_EXTERN_LIB预处理器标志,将所有内容包含在其中。

,但我想做的是创建两个程序:一个使用带有*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定义呢?

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

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

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