“插件”静态库的建议

问题描述:

我正在写一首诗的图书馆以获得乐趣,并且在设计我的任务时遇到困难。我有一个静态库,我想制作一个“静态插件”系统(原谅名称)。“插件”静态库的建议

所以,我想创造出一系列静态库是遵守以下规则:

  • 每个库包含一个单独的对象(一类,或任何需要)
  • 类必须包含一个阵列
  • 每个阵列的产品的阵列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中创建一些包含对外部对象或类似对象调用的类或类似对象。

欢迎任何提示。

+0

因此,你会在库中做一个函数,做转储,每个库的名称相同,并由链接器解析。那么这里有什么问题? –

+0

不仅仅是一个函数,还包括转储所需的所有数据,或者它值得的任何其他函数(例如,搜索一首诗)。 – senseiwa

我不认为你可以在C/C++中做到这一点,每个对象文件只有一个字符串。首先,打印功能需要能够处理某种类型的诗歌列表。

我认为这种事通常是使用编译器静态对象初始化(可能通过注册对象)完成的。

最终你将需要一个符号,主要可以调用哪个是你的字符串链接列表。

所以,你可以创建一个类,它是'将我的字符串添加到字符串列表'类。然后在每个模块中,您都会执行其中一个加法器的静态实例。

随着程序加载,C++运行时库将调用静态对象的所有构造函数,因此您的构造函数应该将该字符串添加到众所周知的列表中。

未定义静态对象的构建顺序,因此请确保该列表是简单的基本类型(指向链接列表头的指针)或者您构建的列表是懒惰构造的(即,第一个构造函数创建列表对象并将其分配给基本指针类型)。

例如:

main。CC

#include <stdio.h> 
#include "poem.h" 

Poem* s_poemList = NULL; 

int main() { 
    Poem* poem = s_poemList; 

    while (poem) { 
    printf("%s\n", 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 Poem1\n"); 

poem2.cc

#include "poem.h" 
static Poem poem("This is the text from Poem2\n"); 

这将创建一个系统,如果你这样做会成功:

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.a文件中的每个对象即使不是必需的通过main.cc