2016-09-23 2 views
0

나는시를위한 재미있는 도서관을 쓰고 있는데, 나는 내 작업을 고안하는데 어려움이있다. 정적 라이브러리가 하나 있는데 "정적 플러그인"시스템 (이름을 용인하십시오)을 만들고 싶습니다."플러그인"정적 라이브러리에 대한 제안

그래서, 나는 다음과 같은 규칙을 존중 정적 라이브러리 일련 만들 싶습니다

  • 각 도서관이 하나의 객체 (클래스, 또는 무엇이든 필요)를 포함를
  • 클래스는 각 배열의 항목의 배열입니다
  • 하나 개의 어레이를 포함해야합니다 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

답변

0

나는 당신이 C/C++에서 각 객체 파일에 단 하나의 문자열로 이것을 할 수 있다고 생각하지 않는다. 우선, 인쇄 기능은 일종의시 목록을 처리 할 수 ​​있어야합니다.

나는 이런 종류의 일은 일반적으로 (등록 개체를 통해) 컴파일러 정적 개체 초기화 프로그램을 사용하여 수행된다고 생각합니다.

궁극적으로 주인이 호출 할 수있는 기호가 필요합니다.이 기호는 문자열에 대한 링크 목록입니다.

그래서 '문자열 목록에 내 문자열 추가'클래스를 만들 수 있습니다. 그런 다음 각 모듈에서 이러한 가산기 중 하나의 정적 인스턴스를 수행합니다.

프로그램이로드 될 때 C++ 런타임 라이브러리는 정적 개체의 모든 생성자를 호출하므로 생성자가 문자열을 잘 알려진 목록에 추가해야합니다.

정적 개체가 생성되는 순서가 정의되어 있지 않으므로 목록이 간단한 기본 형식 (연결된 머리글에 대한 포인터)이거나 목록의 지연 생성 (즉, 첫 번째 생성자는 목록 객체를 만들고이를 기본 포인터 유형에 할당합니다. 예를 들어

:

주.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 main.cc -lpoems 

는 다음 링커가 필요하지 않기 때문에시를 인쇄 할 수 없게됩니다 : 다음

cc -c poem1.cc 
cc -c poem2.cc 
ar cr libpoems.a poem1.o poem2.o 

및 라이브러리 링크 라이브러리에서 객체 파일을 열어서 링크하지 않으므로 생성자가 실행되지 않아 목록이 비어있게됩니다. 링커가 라이브러리의 객체를 포함하도록 강제해야합니다. 내 맥에 나는 할 것이다 :

cc main.cc -Xlinker -force_load ./libpoems.a 
-Xlinker 링커에 다음과 같은 옵션을 전달하고 필요하지 않은 경우에도 -force_load가 ./libpoems.a 파일의 모든 객체를 포함하는 링커를 알려줍니다

main.cc

관련 문제