2014-09-04 5 views
0

Извините за мой английский. Я создал общую библиотеку, и моя программа загружает ее динамически. Он работает нормально, но проблема в том, что я передаю указатель на общую библиотеку, но это не может получить доступ к памяти указателя. В противном случае проблем нет.Общая библиотека не может получить доступ к памяти программы

Любые идеи о том, как это решить?

Примечание: Я использую Linux, но если идея работает на других ОС я буду искать для этого эквивалентного

Вот код:

unsigned analizer::analizeText() { 
std::cout << "thread started" << std::endl; 
while(true) 
{ 
    pause.lock(); 
    varMu.lock(); 
    unsigned enable = __enable; 
    unsigned line = __line; 
    unsigned _colum = __colum; 
    unsigned offset = __offset; 
    varMu.unlock(); 

    unsigned begin = offset; 
    std::cout << "get usafed docs" << std::endl; 
    std::cout << doc->getText() << std::endl;//the program crash 
    vector<document*> doc = _openDocuments->getUnsavedDocs(_openDocuments->traductDoc(this->doc)); std::cout << "relized" << std::endl; 
    while (beginElements.find(_openDocuments->getChar(begin-l)) == beginElements.end() and begin > 0) 
     --begin; 

    word = this->doc->getText().substr(begin,_offset-begin); 

    delete UunFile; 

библиотека нагрузки:

#include <iostream> 

pBear::language *_language; 

using namespace pBear; 

void language::load() 
{ 
    boost::filesystem::directory_iterator end; 
    for (boost::filesystem::directory_iterator it(languagePath); it != end; ++it) 
    { 
     void *hndl = dlopen(it->path().c_str(), RTLD_NOW); 
     if(hndl == NULL) 
     { 
      std::cerr « dlerror() « std::endl; 
      exit(-1); 
     } 
     std::function<LanguageDatas*(pBear::openDocuments*)> fun = (LanguageDatas*(*)(pBear::openDocuments*)) dlsym(hndl, "colorMaker"); 
     LanguageDatas *dat = fun(openDocuments); 
     dataLanguages[dat->getName()] = dat; 
    } 
} 

проход указатель:

ana = _language->getLanguage(doc->getProyect()->getLanguage())->getAnalizer(doc); 

Последние сообщения программы:

анализируем

поток начал

получить usafed Документах

ошибку сегментации (ядро сбрасывали)

+3

Фотографии кода - очень плохая идея, пожалуйста, вставьте код в виде текста – duDE

+0

Добавьте также сообщение об ошибке. – Basilevs

+0

ok, я добавил последние сообщения программы –

ответ

0

В:

std::function<LanguageDatas*(pBear::openDocuments*)> fun = (LanguageDatas*(*)(pBear::openDocuments*)) dlsym(hndl, "colorMaker"); 
LanguageDatas *dat = fun(openDocuments); 

Похоже, вы пытаетесь найти функцию C++ с именем colorMaker в этой общей библиотеке. И затем вы вызываете результат dlsym, не проверяя его на NULL.

Это может быть так, что dlsym возвращает NULL, следовательно, ошибка сегментации.

С подозрением, что C++-функция имеет имя стиля C colorMaker. Дважды проверьте имена символов в этой общей библиотеке.

dlsym никогда не бросает исключения C++, так что вы должны проверить возвращаемое значение:

LanguageDatas(*fun)(pBear::openDocuments*) = static_cast<(LanguageDatas(*)(pBear::openDocuments*)>(dlsym(hndl, "colorMaker")); 
if(!fun) 
    throw std::runtime_error("colorMaker function is not found"); 
fun(openDocuments); 

Обратите внимание, что вам не нужно, чтобы обернуть указатель на функцию в std::function для того, чтобы вызвать его.

+0

Библиотека загружена, это не проблема. Проблема в том, что document * doc является указателем на программу, но библиотека не имеет права читать это. Любая идея решить это? –

+0

Извините, я нашел проблему. Кажется, что «export var» очень опасен для разделяемой библиотеки. благодаря –

Смежные вопросы