C++ 静态库加载相关问题

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

假设我想用二进制文件对libs进行版本设置。对于静态LIB,我认为这种方法是可行的,但它没有:

LibInfo.h-所有LibInfo类的基类。构造子对象时,在
gvLibInfo
向量中注册对象

main.cpp

当我跑的时候,什么也没发生。我认为这可能是由于以下几个原因之一:

  • 在制作
    Lib1 l1
    时,
    gvLibInfo
    尚未构建
  • 我在某个地方看到链接器将从静态库中删除任何未使用的变量。但是,当我在二进制
    nm
    上运行时,它会显示以下内容:
  • 0000000000 603280 B gvLibInfo

    0000000000 603270 B l1

    0000000000 603278 B l2

    我猜
    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"