静态lib加载相关问题

时间:2010-10-07 09:36:46

标签: c++ linux linker g++ static-libraries

假设我想在二进制文件中对libs进行版本化。对于静态库,我认为这种方法可行,但它没有:

  

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

#ifndef IFACE_H
#define IFACE_H

#include <vector>

class LibInfo;
extern std::vector<LibInfo*> gvLibInfo;

class LibInfo
{
    public:
        virtual int getversion() = 0;
        void reglib()
        {
            gvLibInfo.push_back(this);
        }

        LibInfo()
        {
            reglib();
        }
        virtual ~LibInfo()
        {}
};


#endif
  

Lib1.h - 从LibInfo派生并创建一个对象l1。除了getversion返回2之外,Lib2.h是相同的。

#ifndef LIB1_H
#define LIB1_H

#include "LibInfo.h"

class Lib1 : public LibInfo
{
    public:
        int getversion()
        {
            return 1;
        }

    private:
};

Lib1 l1;

#endif
  

的main.cpp

#include "Lib1.h"
#include <iostream>
using namespace std;

vector<LibInfo*> gvLibInfo;

int main()
{       
    for(vector<LibInfo*>::iterator it = gvLibInfo.begin(); it != gvLibInfo.end(); it++)
    {       
        cout << (*it)->getversion() << endl;
    }

    return 0;
}

编译 -

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

当我跑步时,没有任何反应。我认为这可能是由于以下几个原因之一:

  1. 在制作Lib1 l1时,尚未构建gvLibInfo
  2. 我在某处看到链接器将从静态lib中删除任何未使用的变量。但是,当我运行二进制文件nm时,它会显示:
  3. 0000000000603280 B gvLibInfo

    0000000000603270 B l1

    0000000000603278 B l2

    我想l1&amp; l2(类Lib2的相应对象在那里,但'B'标志是什么意思? 3.我不知道的其他事情。

2 个答案:

答案 0 :(得分:1)

将main.cpp的顶部更改为如下所示,以便在派生实例之前创建向量。

#include "LibInfo.h"

std::vector<LibInfo*> gvLibInfo;

#include "Lib1.h"
#include "Lib2.h"
BTW,来自nm的'B'表示BSS中的符号(未初始化的数据)。 nm的手册页列出了所有符号类型。

答案 1 :(得分:0)

这个question的第一个答案建议使用--whole-archive标志。 主要区别在于库不是指外部对象,而是指库 到外部的功能。

-L不会发生链接,但是使用-l,即它应该是:

-L/path/to/libdir -lname

如果你的图书馆是:

/path/to/libdir/libname.a