gpt4 book ai didi

c++ - 静态库加载相关问题

转载 作者:太空狗 更新时间:2023-10-29 12:38:19 32 4
gpt4 key购买 nike

假设我想对制作的二进制文件中的库进行版本控制。对于静态库,我认为这种方法行得通,但行不通:

LibInfo.h - Base class for all libinfo classes. Registers an object in gvLibInfo vector when a child is constructed.

#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 - Derived from LibInfo and creates an object l1. Lib2.h is the same except getversion returns 2.

#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. 我在某处看到链接器将从静态库中删除任何未使用的变量。但是,当我在二进制 nm 上运行时,它显示为:

0000000000603280 B gvLibInfo

0000000000603270 B l1

0000000000603278 B l2

我猜 l1l2(Lib2 类的相应对象在那里,但是那个“B”标志是什么意思?3. 还有一些我不知道的。

最佳答案

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

#include "LibInfo.h"

std::vector<LibInfo*> gvLibInfo;

#include "Lib1.h"
#include "Lib2.h"

顺便说一句,nm 中的“B”表示 BSS 中的符号(未初始化数据)。 nm 的手册页列出了所有符号类型。

关于c++ - 静态库加载相关问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3880380/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com