Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/151.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++;仅链接静态库的所需部分 我试图将静态库的某些部分链接到Linux下用C++编写的C++程序。_C++_Static_G++ - Fatal编程技术网

C++;仅链接静态库的所需部分 我试图将静态库的某些部分链接到Linux下用C++编写的C++程序。

C++;仅链接静态库的所需部分 我试图将静态库的某些部分链接到Linux下用C++编写的C++程序。,c++,static,g++,C++,Static,G++,我的图书馆 #ifdef USE_EXTERN_LIB # include <extern_lib.h> void do_something (struct extern_lib); #endif void do_other (int); 我正在静态地创建libmy_lib.a和-DUSE_EXTERN_lib预处理器标志,以将所有内容都包含在其中 但我要做的是创建两个程序:一个使用带有*extern_lib*的库,另一个不使用*extern_lib*的库,即: g++ -L/p

我的图书馆

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

void do_other (int);
我正在静态地创建libmy_lib.a和-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_.cc

#include "my_lib.h"

int main ()
{
  do_other (42);

  return 0;
}
带有_lib.cc的prog_

#include "my_lib.h"

int main ()
{
  do_other (42);

  struct extern_lib l;
  do_something (l);

  return 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

还要注意,我将库放在命令行的末尾。它可能不再需要了,但以前是链接器按照命令行中给定的顺序扫描输入文件,因此如果在使用对象文件之前,命令行中有一个库,则链接器退出时会出现一个错误,表示找不到符号。

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


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

您能告诉我们“第二次”编译的确切错误吗?我将假设第二种方法定义了
使用外部库
。您是否将
包括在my_LIB.c中的“my_LIB.h”
?对不起,这是第一个没有编译的程序。您可以在没有库源的情况下发布程序吗?它会自动执行此操作。如果静态库中的函数未在可执行文件中使用,则不会将其从库复制到可执行文件中。
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