"plugin"静态库的建议
Suggestion for "plugin" static library
我正在写一首诗的库,我觉得很有趣,但我很难设计我的任务。我有一个静态库,我想做一个"静态插件"系统(原谅名字)。
因此,我想创建一系列静态库,它们遵循以下规则:- 每个库包含一个单独的对象(一个类,或任何需要的) 类必须包含一个数组
- 每个数组的项都是
unsigned char
的数组
本质上,我想创建一系列图书馆,在这个任务中提供诗歌列表。因此,每个图书馆包含一个作者的诗歌。
现在我需要的部分是:库用户将链接所需的静态插件和主库。这样,用户就可以在控制台打印整个诗歌库,如下面的简单示例所示:
#include "poems.hpp"
int main(int argc, const char * argv[])
{
poems p;
p.dump(">>> Dumping poems");
return 0;
}
所有进程在链接时处理
$ clang++ a.cpp libpoems.a libplugin_coleridge.a
$ ./a.out
>>> Dumping poems
The Rime of the Ancient Mariner
It is an ancient Mariner,
And he stoppeth one of three.
[...]
Kubla Khan
In Xanadu did Kubla Khan
A stately pleasure-dome decree:
[...]
或替代
$ clang++ a.cpp libpoems.a libplugin_shelley.a
$ ./a.out
>>> Dumping poems
Ozymandias
O wild West Wind, thou breath of Autumn's being,
Thou, from whose unseen presence the leaves dead
[...]
Ode To The West Wind
O wild West Wind, thou breath of Autumn's being,
Thou, from whose unseen presence the leaves dead
[...]
我想我可以在poem.hpp
中创建一些类或类似的,包含对外部对象的调用,或类似的东西。
欢迎任何提示
我不认为你可以在C/c++中做到这一点,在每个对象文件中只有一个字符串。首先,打印功能需要能够处理某种类型的诗歌列表。
我认为这类事情通常是使用编译器静态对象初始化器(可能通过注册对象)完成的。
最终你将需要一个符号,主程序可以调用它,它是一个链接到你的字符串的列表。
你可以创建一个类它是一个'add my string to a list of strings'类。然后在每个模块中执行这些加法器之一的静态实例。
当程序加载时,c++运行时库将调用静态对象的所有构造函数,因此构造函数应该将字符串添加到已知的列表中。
静态对象的构造顺序没有定义,所以要确保列表要么是一个简单的基类型(指向链表头的指针),要么是对列表进行惰性构造(即第一个构造函数创建列表对象并将其分配给基指针类型)。
例如:main.cc
#include <stdio.h>
#include "poem.h"
Poem* s_poemList = NULL;
int main() {
Poem* poem = s_poemList;
while (poem) {
printf("%sn", poem->text);
poem = poem->next;
}
}
poem.h
#ifndef __POEM_H__
#define __POEM_H__
class Poem;
extern Poem* s_poemList;
class Poem {
public:
Poem(const char* text)
: text(text) {
next = s_poemList;
s_poemList = this;
}
class Poem* next;
const char* text;
};
#endif
poem1.cc
#include "poem.h"
static Poem poem("This is the text from Poem1n");
poem2.cc
#include "poem.h"
static Poem poem("This is the text from Poem2n");
这将创建一个系统,如果你这样做,它将成功:
cc main.cc poem1.cc poem2.cc
每个对象都将被链接到可执行文件中,并且链接器将确保调用构造函数。
然而,如果你把这些诗做成一个档案:
cc -c poem1.cc
cc -c poem2.cc
ar cr libpoems.a poem1.o poem2.o
,然后链接该库:
cc main.cc -lpoems
那么它将无法打印诗歌,因为链接器不需要库中的目标文件,所以它不会链接它们,所以构造函数不会运行,所以列表将保持空。您需要强制链接器包含库中的对象。在我的Mac上,我会输入:
cc main.cc -Xlinker -force_load ./libpoems.a
其中-Xlinker将以下选项传递给链接器,-force_load告诉链接器包含./libpoems. js文件中的每个对象。一个文件,即使main.cc
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗
- #为""定义宏;静态";针对不同的上下文
- cmake如何在fedora工作站中找到boost静态库包
- 静态数据成员的问题-修复链接错误会导致编译器错误
- 将公共但非静态的成员函数与ALGLIB集成
- cmake在我的项目中所需的所有静态库都不成功
- C++从另一个类访问公共静态向量的正确方法是什么
- 基于boost的程序的静态链接——zlib问题
- 在静态库中嵌入类方法
- Qt C++静态thread_local QNetworkAccessManager是线程应用程序的好选择吗
- 如何在C++中获得"静态纯虚拟"功能?
- 私有类型的静态常量成员
- 使用gcc从静态链接的文件中查找可选符号
- 在 .h 文件中的类中声明静态变量和在.cpp文件中声明"global"变量有什么区别
- 如何在C++中使用非静态成员函数作为回调函数
- 将静态库链接到不带-fPIC的共享库中
- 静态结构和一个定义规则
- 为什么虚函数不能是静态的和全局的?
- C++17中函数模板中的静态数组初始化(MSVC 2019)
- "plugin"静态库的建议