Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Компиляция приложения с поддержкой dll плагина, mingw 
:(
    Опции темы
SABROG
Дата 26.1.2008, 19:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Hacker
****


Профиль
Группа: Завсегдатай
Сообщений: 2481
Регистрация: 18.9.2006

Репутация: нет
Всего: 91



Есть программа, которая может работать как с плагином, так и без него. Плагин реализован в виде .dll файла.
Будет ли использоваться плагин или нет решается на этапе компиляции. Компилятор mingw.

Плагин экспортирует ряд функций, которые вызывает основная программа. Сами функции плагина используют методы из основной программы, т.е. основная программа компилится как -shared и экспортирует ряд своих функций. Таким образом получается полное связывание: dll <-> exe
К dll линкуется exe, к exe линкуется dll.

У линковщика gcc есть ключ --out-implib=main.a, который позволяет помимо сборки .exe файла экспортировать библиотеку, которую можно прилинковать к плагину (dll). 

Т.к. получается замкнутый круг мне необходимо, чтобы линковщик не создавал .exe файла, а только экспортировал main.a файл, который я бы прилинковал к dll, а после этого собрал бы уже exe файл с прилинкованной dll.a библиотекой после сборки плагина.

Сборка .exe файла идет таким образом:

Код

g++ -s -L"c:\include" -Wl,--out-implib=main.a -o"main.exe" ./src/main.o -lwsock32 -lwinmm -lws2_32 -lz -lgdi32
Creating library file: main.a


Если убрать '-o"main.exe"', то все-равно создается файл "a.exe", мне нужен только main.a файл на данном этапе

Это сообщение отредактировал(а) SABROG - 26.1.2008, 19:53


--------------------
Национальная группа Russian Federation на QtCentre.
PM MAIL   Вверх
archimed7592
Дата 26.1.2008, 21:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


Профиль
Группа: Завсегдатай
Сообщений: 2531
Регистрация: 12.6.2004
Где: Moscow

Репутация: нет
Всего: 93



SABROG, учитывая, что из себя представляет import library, боюсь, что такое невозможно. Необходимо провести декомпозицию и избавится от цикличной зависимости.

Могу я в очередной раз поинтересоваться, как Ваш пост относится к специфике данного раздела?


--------------------
If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas.
© George Bernard Shaw
PM Jabber   Вверх
SABROG
Дата 26.1.2008, 23:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Hacker
****


Профиль
Группа: Завсегдатай
Сообщений: 2481
Регистрация: 18.9.2006

Репутация: нет
Всего: 91



Часть названия ветки "Кроссплатформенное программирование". 
У меня кроссплатформенный проект, который отлично собирается под nix'ами и в винде через MSVC.
Я хочу сделать возможным собирать проект через mingw. Работа закончена на 70%.

Насчет "невозможности" я не соглашусь, проект как-раз так и работал, собран он был лишь в msvc. Сейчас я пытаюсь понять как мне написать makefile для mingw, чтобы в правильной последовательности и без "хаков" заставить проект собираться...

Цикличной зависимости не возникает, скорее всего потому, что сначала грузится main.exe, который в свою очередь подгружает статически слинкованную dllку, та в свою очередь пытается подгрузить снова main.exe, но ОС находит ее уже загруженной в память, поэтому цикл на этом прерывается.

Это сообщение отредактировал(а) SABROG - 26.1.2008, 23:19


--------------------
Национальная группа Russian Federation на QtCentre.
PM MAIL   Вверх
archimed7592
Дата 26.1.2008, 23:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


Профиль
Группа: Завсегдатай
Сообщений: 2531
Регистрация: 12.6.2004
Где: Moscow

Репутация: нет
Всего: 93



Цитата(SABROG @  26.1.2008,  23:09 Найти цитируемый пост)
Насчет "невозможности" я не соглашусь, проект как-раз так и работал, собран он был лишь в msvc.

Можно глянуть на hello world солюшн с циклической связью? (приаттачьте)
Возможно, так будет проще помочь Вам.

Цитата(SABROG @  26.1.2008,  23:09 Найти цитируемый пост)
Сейчас я пытаюсь понять как мне написать makefile

Можно попробовать удалять .exe после сборки, но я что-то сомневаюсь, что это будет работать(в плане makefile будет работать правильно, но, боюсь, не будет работать последующая линковка или сам бинарник).


--------------------
If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas.
© George Bernard Shaw
PM Jabber   Вверх
SABROG
Дата 26.1.2008, 23:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Hacker
****


Профиль
Группа: Завсегдатай
Сообщений: 2481
Регистрация: 18.9.2006

Репутация: нет
Всего: 91



Ну с нуля писать hello world накладно, но я нашел наглядный пример - http://www.codeguru.com/cpp/w-p/dll/article.php/c3649/

Вроде как начало проясняться, plugin.dll статически линкует exe файл, exe файл динамически подгружает plugin.dll. Только сейчас косяк возник со статической линковкой exe файла:

Код

Info: resolving vtable for FollowerReferenceby linking to __imp___ZTV17FollowerReference (auto-import)
src\bindings\universal\ScriptMgr.o(.text+0x226):ScriptMgr.cpp: variable 'vtable for FollowerReference' can't be auto-imported. Please read the documentation for ld's --enable-auto-import for details.


В exe файле этот экспортируемый класс объявлен так:

Код

class  __declspec(dllexport) FollowerReference : public Reference<Unit, TargetedMovementGeneratorBase>
{
    protected:
        void targetObjectBuildLink();
        void targetObjectDestroyLink();
        void sourceObjectDestroyLink();
};


Это сообщение отредактировал(а) SABROG - 27.1.2008, 00:09


--------------------
Национальная группа Russian Federation на QtCentre.
PM MAIL   Вверх
archimed7592
Дата 27.1.2008, 00:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


Профиль
Группа: Завсегдатай
Сообщений: 2531
Регистрация: 12.6.2004
Где: Moscow

Репутация: нет
Всего: 93



Цитата(SABROG @  26.1.2008,  23:58 Найти цитируемый пост)
Только в моем случае GetProcAddress не вызывается.

smile.
В этом принципиальная разница, т.к. в случае, если оперировать GetProcAddress циклической зависимости не будет. Вам же требуется связывание, так сказать, на этапе компиляции. Вы утверждаете, что проделывали такое на c MSVC, вот я и прошу привести мне пример т.к. мне немного не верится, что такое возможно...


--------------------
If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas.
© George Bernard Shaw
PM Jabber   Вверх
Любитель
Дата 27.1.2008, 02:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Программист-романтик
****


Профиль
Группа: Комодератор
Сообщений: 3645
Регистрация: 21.5.2005
Где: Воронеж

Репутация: нет
Всего: 92




M
Любитель
SABROG, читаем что обсуждается в C/C++: КП :)

 


--------------------
PM MAIL ICQ Skype   Вверх
SABROG
Дата 27.1.2008, 12:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Hacker
****


Профиль
Группа: Завсегдатай
Сообщений: 2481
Регистрация: 18.9.2006

Репутация: нет
Всего: 91



Ладно, похоже придется дальше самому ковыряться. Тему можно удалить.

Написал именно в этом разделе, потому, что нужен совет специалистов, которые работали как с MSVC так и с компилятором GCC.


--------------------
Национальная группа Russian Federation на QtCentre.
PM MAIL   Вверх
archimed7592
Дата 27.1.2008, 14:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


Профиль
Группа: Завсегдатай
Сообщений: 2531
Регистрация: 12.6.2004
Где: Moscow

Репутация: нет
Всего: 93



SABROG, на мой взгляд, то что ты пытаешься сделать сродни двум хэдерам с перекрёстной зависимостью, но без forward declarations.


--------------------
If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas.
© George Bernard Shaw
PM Jabber   Вверх
SABROG
Дата 27.1.2008, 14:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Hacker
****


Профиль
Группа: Завсегдатай
Сообщений: 2481
Регистрация: 18.9.2006

Репутация: нет
Всего: 91



Такое вот по какой причине обычно вылезает ?

Код

Info: resolving vtable for FollowerReferenceby linking to __imp___ZTV17FollowerReference (auto-import)
src\bindings\universal\ScriptMgr.o(.text+0x226):ScriptMgr.cpp: variable 'vtable for FollowerReference' can't be auto-imported. Please read the documentation for ld's --enable-auto-import for details.


В .def файле и в .a файле четко вижу наличие __imp___ZTV17FollowerReference. FollowerReference - класс.


--------------------
Национальная группа Russian Federation на QtCentre.
PM MAIL   Вверх
archimed7592
Дата 27.1.2008, 15:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


Профиль
Группа: Завсегдатай
Сообщений: 2531
Регистрация: 12.6.2004
Где: Moscow

Репутация: нет
Всего: 93



Цитата(SABROG @  27.1.2008,  14:54 Найти цитируемый пост)
Такое вот по какой причине обычно вылезает ?

Нужно добавить ключик --enable-runtime-pseudo-relocs.


--------------------
If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas.
© George Bernard Shaw
PM Jabber   Вверх
SABROG
Дата 27.1.2008, 15:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Hacker
****


Профиль
Группа: Завсегдатай
Сообщений: 2481
Регистрация: 18.9.2006

Репутация: нет
Всего: 91



Добавлял уже, не помогает никак вообще, выводит тоже самое.

Попробывал метод без подключения .a, а просто переименовал main.exe -> libmain.dll и линкер его подцепил точно также как и .a и с теми же ошибками.

Странно, обнаружил, что -export-all-symbols у меня, по какой-то причине, не включен по-умолчанию. После включения либа (main.a) разжирела на 8 мегов, исчезли проблемы с другими импортами, а вот именно с этим остались...
---------

Углубился в тему. Немного разобравшись, понял где происходит косяк, но не понял как это исправить. 
Значит смысл такой, есть .exe файл в котором определен класс, этот .exe файл динамически загружает plugin.dll, а он в свою очередь статически слинкован с exe файлом. Так вот благодаря тому, что в хидерах описано определние класса из плагина создается экземпляр объекта через оператор new. Методы этого объекта находятся в exe файле. Не могу понять, почему MSVC все это хавает, а gcc не хочет:

Код

Info: resolving vtable for FollowerReferenceby linking to __imp___ZTV17FollowerReference (auto-import)
src\bindings\universal\ScriptMgr.o(.text+0x226):ScriptMgr.cpp: variable 'vtable for FollowerReference' can't be auto-imported. Please read the documentation for ld's --enable-auto-import for details.
src\bindings\universal\ScriptMgr.o(.text+0x23a):ScriptMgr.cpp: variable 'vtable for FollowerReference' can't be auto-imported. Please read the documentation for ld's --enable-auto-import for details.


Это сообщение отредактировал(а) SABROG - 27.1.2008, 19:31


--------------------
Национальная группа Russian Federation на QtCentre.
PM MAIL   Вверх
archimed7592
Дата 28.1.2008, 08:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


Профиль
Группа: Завсегдатай
Сообщений: 2531
Регистрация: 12.6.2004
Где: Moscow

Репутация: нет
Всего: 93



SABROG, смотри, вот hello world пример(возможно, что неправильный):
Код

// main.cpp
struct B
{
    virtual ~B();
};

struct D1
    :    public B
{ };

B::~B()
{ }

int main()
{ }


// dll.cpp
struct B
{
    virtual ~B();
};

struct D1
    :    public B
{ };

struct D2
    :    public B
{ };

int test()
{
    return 5;
}

Код

archimed7592@NB ~/testlabs/g++
$ g++ -shared -Wl,--out-implib,libmain.a ./main.cpp
Creating library file: libmain.a

archimed7592@NB ~/testlabs/g++
$ g++ -shared -o dll.dll ./dll.cpp -L. -lmain

archimed7592@NB ~/testlabs/g++
$ pexports.exe a.exe
LIBRARY a.exe
EXPORTS
_ZN1BD0Ev
_ZN1BD1Ev
_ZN1BD2Ev
_ZTI1B DATA
_ZTS1B DATA
_ZTV1B DATA
main

archimed7592@NB ~/testlabs/g++
$ pexports.exe dll.dll
LIBRARY dll.dll
EXPORTS
_Z4testv

archimed7592@NB ~/testlabs/g++
$


Что я делаю неправильно? smile


--------------------
If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas.
© George Bernard Shaw
PM Jabber   Вверх
SABROG
Дата 28.1.2008, 09:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Hacker
****


Профиль
Группа: Завсегдатай
Сообщений: 2481
Регистрация: 18.9.2006

Репутация: нет
Всего: 91



Забыл декорацию __declspec(dllexport) ?

Взял пример, на который выкладывал ссылку выше, и переделал его немного. Все собирается, но при вызове программы выдает "main.exe не является приложением Win32". Исходники тут http://filebeam.com/746ddc0026e738bcda9f20e2356edffe

------
Так, с main.exe я разобрался, ошибка была потому, что я его собирал с флагом -shared.

Это сообщение отредактировал(а) SABROG - 28.1.2008, 18:41


--------------------
Национальная группа Russian Federation на QtCentre.
PM MAIL   Вверх
archimed7592
Дата 28.1.2008, 19:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


Профиль
Группа: Завсегдатай
Сообщений: 2531
Регистрация: 12.6.2004
Где: Moscow

Репутация: нет
Всего: 93



Цитата(SABROG @  28.1.2008,  09:06 Найти цитируемый пост)
Забыл декорацию __declspec(dllexport) ? 

Не совсем, но не суть smile. Да, проблема интересная и, как не странно, решения в интернете я не нашёл, а искал долго(очень долго - самому скоро понадобится). В общем, сейчас есть задачи поважнее, но, как только, так сразу займусь этой проблемой.


--------------------
If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas.
© George Bernard Shaw
PM Jabber   Вверх
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | GNU toolchain | Следующая тема »


 




[ Время генерации скрипта: 0.0606 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.