我正在尝试将静态库的某些部分链接到使用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;
}
感谢。
答案 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
另请注意,我将库放在命令行的末尾。它可能不再需要了,但它曾经是链接器按照命令行上给出的顺序扫描输入文件,因此如果在使用它的对象文件之前在命令行上有一个库,则链接器退出无法找到符号的错误。