假设我想在二进制文件中对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
当我跑步时,没有任何反应。我认为这可能是由于以下几个原因之一:
Lib1 l1
时,尚未构建gvLibInfo
。 nm
时,它会显示:0000000000603280 B gvLibInfo
0000000000603270 B l1
0000000000603278 B l2
我想l1
&amp; l2
(类Lib2
的相应对象在那里,但'B'标志是什么意思?
3.我不知道的其他事情。
答案 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