C++ 静态库加载相关问题
假设我想用二进制文件对libs进行版本设置。对于静态LIB,我认为这种方法是可行的,但它没有: LibInfo.h-所有LibInfo类的基类。构造子对象时,在C++ 静态库加载相关问题,c++,linux,linker,g++,static-libraries,C++,Linux,Linker,G++,Static Libraries,假设我想用二进制文件对libs进行版本设置。对于静态LIB,我认为这种方法是可行的,但它没有: LibInfo.h-所有LibInfo类的基类。构造子对象时,在gvLibInfo向量中注册对象 main.cpp 当我跑的时候,什么也没发生。我认为这可能是由于以下几个原因之一: 在制作Lib1 l1时,gvLibInfo尚未构建 我在某个地方看到链接器将从静态库中删除任何未使用的变量。但是,当我在二进制nm上运行时,它会显示以下内容: 0000000000 603280 B gvLibInfo 0
gvLibInfo
向量中注册对象
main.cpp
当我跑的时候,什么也没发生。我认为这可能是由于以下几个原因之一:
Lib1 l1
时,gvLibInfo
尚未构建李>
nm
上运行时,它会显示以下内容:l1
和l2
(类Lib2
的对应对象在那里,但是“B”标志意味着什么?
3.还有一点我不知道。对此的第一个答案建议使用--whole archive标志。
主要区别在于,库引用的不是外部对象,而是
对一个外部功能
链接不是与-L一起出现的,而是与-L一起出现的,即它应该是:
-L/path/to/libdir -lname
如果您的库是:
/path/to/libdir/libname.a
将main.cpp的顶部更改为如下所示,以便在派生实例之前创建向量
#include "LibInfo.h"
std::vector<LibInfo*> gvLibInfo;
#include "Lib1.h"
#include "Lib2.h"
#包括“LibInfo.h”
std::向量gvLibInfo;
#包括“Lib1.h”
#包括“Lib2.h”
顺便说一句,nm中的“B”表示BSS中的符号(未初始化数据)。nm的手册页列出了所有符号类型。我运行了一个gdb会话。确实,向量似乎是在加载静态库之后构建的。那么,1.我可以延迟库加载或强制向量以某种方式提前构建吗?2.或者,我是否只需要使用原始数据类型?此外,如果我删除
,则包括“Lib1.h”
从main.cpp中,将其替换为#include“LibInfo.h”
然后我nm
不显示符号l1
和l2
:D。我的第一个问题解决了。u属性((init\u priority())
解决了这个问题。现在我希望有人帮我解决上述问题。:)这是一个问题,你应该在哪里更新整个归档的东西。但是,如果我更新了,没有人会注意到,是吗?
g++ -c Lib1.h -o Lib1.o
g++ -c Lib2.h -o Lib2.o
ar cr lib.a Lib1.o Lib2.o
g++ main.cpp -o app -L/home/duminda/statictest/lib.a
-L/path/to/libdir -lname
/path/to/libdir/libname.a
#include "LibInfo.h"
std::vector<LibInfo*> gvLibInfo;
#include "Lib1.h"
#include "Lib2.h"