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