Поиск:

Ответ в темуСоздание новой темы Создание опроса
> MinGV собрать библиотеку 
V
    Опции темы
_hunter
  Дата 10.7.2006, 13:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

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



Добрый день.

Подскажите, пожалуйста, как с помощью MinGV собрать .dll из файла, содержащего DllMain

С уважением... 


--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
srd
Дата 10.7.2006, 15:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Нереварин
**


Профиль
Группа: Участник Клуба
Сообщений: 951
Регистрация: 30.8.2003
Где: Владивосток

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



Я попробовал следующим образом:

Исходный код самой DLL
Код

#include <windows.h>
#include <stdio.h>

__declspec(dllexport) int test_function(void)
{
    printf("test_function\n");
    return 0;
}

BOOL WINAPI DllMain(HINSTANCE hInstance,
                    DWORD dwReason,
                    void *lpvReserved)
{
    switch (dwReason)
    {
    case DLL_PROCESS_ATTACH:
        printf("DllMain attach\n");
    break;
    case DLL_PROCESS_DETACH:
        printf("DllMain detach\n");
    break;
    }

    return TRUE;
}


Тестовая программка:
Код

#include <stdio.h>

__declspec(dllimport) int test_function(void);

int main(void)
{
    return test_function();
}


Команда для сборки DLL:
Код

gcc test.c -shared -o test.dll -Wl,--out-implib,libtest.a

После чего появились test.dll и библиотека импорта libtest.a

Сборка тестовой программки:
Код

gcc hello.c -L./ -ltest -o hello.exe


Если теперь запустить hello.exe, то можно увидеть следующий вывод
Код

DllMain attach
test_function
DllMain detach

Т.е. DllMain вызывается без дополнительных телодвижений с нашей стороны.

Узнать больше, видимо, можно здесь 


--------------------
Не смей читать мою подпись!!!
PM MAIL Jabber   Вверх
_hunter
Дата 10.7.2006, 18:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

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



он на это (на попытку собрать .exe) говорит stdio.h: No such file or directory.
еще, чтоли, заголовки куда-то копировать нужно? 


--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
_hunter
Дата 12.7.2006, 17:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

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



а можно как-то имея make-файл сделать так, чтобы он .dll генерил?
я в секции
Код

ffmpeg_g$(EXESUF): ffmpeg.o cmdutils.o .libs
    $(CC) $(FFLIBDIRS) $(LDFLAGS) -o $@ ffmpeg.o cmdutils.o $(FFLIBS) $(EXTRALIBS)

приписал -shared:
Код

ffmpeg_g$(EXESUF): ffmpeg.o cmdutils.o .libs
    $(CC) $(FFLIBDIRS) $(LDFLAGS) -shared -o $@ ffmpeg.o cmdutils.o $(FFLIBS) $(EXTRALIBS)

это нормально? 


--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
srd
Дата 12.7.2006, 17:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Нереварин
**


Профиль
Группа: Участник Клуба
Сообщений: 951
Регистрация: 30.8.2003
Где: Владивосток

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



Для ffmpeg если сам скрипт configure запустить с ключами --enable-shared --disable-static, то он сгенерирует makefile как раз для сборки DLL и соответствующий библиотеки импорта.

Цитата(_hunter @  13.7.2006,  00:01 Найти цитируемый пост)

Код

ffmpeg_g$(EXESUF): ffmpeg.o cmdutils.o .libs
    $(CC) $(FFLIBDIRS) $(LDFLAGS) -shared -o $@ ffmpeg.o cmdutils.o $(FFLIBS) $(EXTRALIBS)


Кроме ключа -shared нужно ещё передать ключ линкеру для генерации библиотеки импорта:
Код

-Wl,--out-implib,libffmpeg_g.a

Ключ -o $@ задаёт имя выходного файла ffmpeg_g$(EXESUF). Мне кажется, что переменная EXESUF имеет значение .exe. Т.е. у тебя сгенерируется DLL, но с расширением exe smile Надо заменить на -o ffmpeg_g.dll
 


--------------------
Не смей читать мою подпись!!!
PM MAIL Jabber   Вверх
_hunter
Дата 12.7.2006, 18:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

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



если собирать после ./configure --enable-shared --disable-static получаю (от make)
Цитата

/usr/lib/gcc/i686-pc-cygwin/3.4.4/../../../../i686-pc-cygwin/bin/ld: cannot find -lavutil
collect2: ld returned 1 exit status
make[1]: *** [libavcodec.so.51] Error 1
make[1]: Leaving directory `/cygdrive/c/workspace/ffmpeg/ffmpeg/libavcodec'
make: *** [lib] Error 2


а если мне не нужна библиотека импорта (.dll я буду LoadLibrary грузить) и расширение не критично -- можно так генерить? 


--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
srd
Дата 12.7.2006, 18:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Нереварин
**


Профиль
Группа: Участник Клуба
Сообщений: 951
Регистрация: 30.8.2003
Где: Владивосток

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



Цитата(_hunter @  13.7.2006,  01:16 Найти цитируемый пост)
а если мне не нужна библиотека импорта (.dll я буду LoadLibrary грузить) и расширение не критично -- можно так генерить? 

Ну, я думаю, что можно. Но, наверное, лучше сначала посмотреть, где у тебя лежит файл libavutil.a, и если он есть, попробовать его скопировать в то место, где его увидит ld
 


--------------------
Не смей читать мою подпись!!!
PM MAIL Jabber   Вверх
_hunter
Дата 12.7.2006, 18:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

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



в том то и проблема, что нету...
в папке libavutil есть только libavutil.so.49 и libavutil.so.lnk 


--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
_hunter
Дата 13.7.2006, 13:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

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



еще проблема:
экспортирую из .dll функцию Test:
Код

__declspec(dllexport) int Test()
{
    FILE* file = fopen("c:\\Workspace\\ffmpeg\\Client\\Debug\\log.txt", "w");
    if (file != NULL)
    {
        fprintf(file, "1");
        
        fclose(file);
    }

    return 1;
}

при ее вызове в студии:
Код

    typedef int (*TEST_PROC)();
    HMODULE library = LoadLibrary("ffmpeg.dll");
    if (library)
    {
        TEST_PROC Test = (TEST_PROC)GetProcAddress(library, "Test"); 
        if (Test) 
        {
            int result = (Test)();

получаю Unhandled exception.
а если ее сделать такой:
Код

__declspec(dllexport) int Test()
{
    return 10;
}

-- вызов проходит нормально... 


--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
_hunter
Дата 13.7.2006, 16:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

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



еще добавление: вызов вообше любой функции RTL (даже strcpy) обламывается... 


--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
srd
Дата 15.7.2006, 14:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Нереварин
**


Профиль
Группа: Участник Клуба
Сообщений: 951
Регистрация: 30.8.2003
Где: Владивосток

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



Цитата(_hunter @  13.7.2006,  01:47 Найти цитируемый пост)
в том то и проблема, что нету...в папке libavutil есть только libavutil.so.49 и libavutil.so.lnk 
А откуда там *.so файлы взялись? Ты, случаем, не запустил кросс-компиляцию для Linux (или как это называется)?

 


--------------------
Не смей читать мою подпись!!!
PM MAIL Jabber   Вверх
_hunter
Дата 17.7.2006, 10:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

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



но собираются то .dll-ки/.exe-шники... 


--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
sekiro
Дата 17.7.2006, 11:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 29
Регистрация: 14.4.2006

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



Я бы посоветовал поставить dev-c++, чтобы не мучиться с make-файлами и командной строкой. А дальше все просто.

Код

#include <windows.h>
#define EXPORT extern "C" __declspec(dllexport)

BOOL APIENTRY DllMain(HINSTANCE hInst, DWORD reason, LPVOID reserved)
    {
    return TRUE;
    }

EXPORT int Test()
    {
    ...
    }


Далее в параметрах проекта добавляем дополнительный параметр компилятору: -DBUILDING_DLL=1

Компилируем и радуемся жизни... 
PM MAIL   Вверх
_hunter
Дата 17.7.2006, 11:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

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



у меня уже есть готовій проект с make-файлом.
этот dev-c++ его сможет собрать?


щас провел эксперимент: создал в студии консольное приложение из которого экспортирую функцию:
Код

extern "C" __declspec(dllexport) int Test()
{
    FILE* file = fopen("c:\\log.txt", "w");
    if (file != NULL)
    {
        fprintf(file, "1");
        
        fclose(file);
    }

    return 20;
}

при попытке ее вызвать получаю аналогичное UhE.
но если в ствойствах проекта General->Configuration Type поставить Dynamic Library (вместо Application) -- функция вызывается нормально.
значит опции shared недостаточно.
 


--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
_hunter
Дата 17.7.2006, 13:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

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



как бы собралось -- перенес -shared непосредственно к опциям ffmpeg
теперь с отладкой проблемы... 


--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | GNU toolchain | Следующая тема »


 




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


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

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