c++链接只需要静态库的一部分
C++ Link only desired part of a static library
我正在尝试将静态库的某些部分链接到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
还请注意,我将库放在命令行末尾。这可能不再需要了,但它曾经是链接器按照命令行给出的顺序扫描输入文件,所以如果一个库在使用它的对象文件之前在命令行上,链接器会退出并显示一个错误,说找不到符号。
相关文章:
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗
- #为""定义宏;静态";针对不同的上下文
- cmake如何在fedora工作站中找到boost静态库包
- 静态数据成员的问题-修复链接错误会导致编译器错误
- 将公共但非静态的成员函数与ALGLIB集成
- cmake在我的项目中所需的所有静态库都不成功
- C++从另一个类访问公共静态向量的正确方法是什么
- 基于boost的程序的静态链接——zlib问题
- 在静态库中嵌入类方法
- Qt C++静态thread_local QNetworkAccessManager是线程应用程序的好选择吗
- 如何在C++中获得"静态纯虚拟"功能?
- C++:如何使函数只返回作为列表一部分的字符串
- 私有类型的静态常量成员
- 使用gcc从静态链接的文件中查找可选符号
- 为什么将FMTFLAG指定两次 - 作为枚举的一部分,而另一个实例为静态const变量
- 为什么静态数据成员在 C++ 中不是对象的一部分
- 如何在VC++静态库中加载自定义二进制资源作为dll的一部分
- 引用静态函数作为类定义的一部分是否有任何开销?
- c++链接只需要静态库的一部分
- Log4Cxx作为静态构建的一部分