Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Как из файлов .c и .def получить (udf).dll


Автор: Bose 20.3.2009, 18:59
Дано:
есть исходник udf-ки для Firebird на Си
есть .def файл в котором перечислены экспортируемые функции.
есть Windows компьютер на котором установлены cygwin и mingw

Необходимо:
Скомпилировать этот исходник в .dll-ку, (UDF для Firebird-a)
Скомпилировать этот исходник в .so, (UDF для Firebird-a, в версии для *nix)

Известно:
Что этот исходник рабочий.
Что из него когда-то делали и so и dll. 

Помогите пожалуйста разобраться с последовательностью действий. С gcc столкнулся впервые.

Пробовал собрать по примеру http://sourceware.org/binutils/docs-2.16/binutils/dlltool.html#dlltool:
       gcc -c dll.c
       dlltool -e exports.o -l dll.lib dll.o
       gcc dll.o exports.o -o dll.dll

Процесс падает на последней строчке с сообщением о том, что exports.o не найден.


Автор: Bose 20.3.2009, 19:39
И кстати, если первую строку выполнить так(без ключа -с):
gcc dll.c

то gcc выводит ошибку:

fwudf.o:fwudf.c:(.text+0xbf2): undefined reference to `_isc_decode_date' (таких строчек несколько)
fwudf.o:fwudf.c:(.text+0x153f): more undefined references to `_isc_decode_date' follow
/usr/lib/gcc/i686-pc-cygwin/3.4.4/../../../libcygwin.a(libcmain.o):(.text+0xab): undefined reference to `_WinMain@16'
collect2: ld returned 1 exit status


Автор: Bose 20.3.2009, 20:19
Цитата(Bose @  20.3.2009,  17:59 Найти цитируемый пост)
Пробовал собрать по примеру из хелпа к dlltool:
       gcc -c dll.c
       dlltool -e exports.o -l dll.lib dll.o
       gcc dll.o exports.o -o dll.dll

Процесс падает на последней команде с сообщением о том, что exports.o не найден.

Эта проблема проявляется при компиляции с помощью MinGW. exports.o почему-то не создаётся.

В CygWin же вторая команда проходит, нормально. exports.o вроде создаётся. 
Процесс тормозится на третьей команде
       gcc dll.o exports.o -o dll.dll
с сообщением об
Код

undefined reference to `isc_decode_date' (таких строчек несколько)


isc_decode_date упоминается в файле ibase.h. 

А dll.c выглядит примерно так:
Код

#include <string.h>
#include <stdlib.h>
#include <math.h>
#include <ibase.h>
#include <ib_util.h>
#include <time.h>

ISC_QUAD* fn_incdate(ISC_QUAD* d1, int* days, int* months, int* years)
{
    struct tm tm1;
    ISC_QUAD* res= malloc( sizeof(ISC_QUAD) );
    isc_decode_date(d1, &tm1);
    incdate( &tm1, *days, *months, *years );
    isc_encode_date( &tm1, res );
    return res;
}


Добавлено через 4 минуты и 28 секунд
Я так подозреваю, что для того, чтобы всё собралось, нужно либо что-то ещё прилинковать, либо указать какой-то ключ в командной строке, но не знаю что именно. Хееелп!

Автор: Bose 20.3.2009, 21:21
Кстати, использование MinGW или CygWin не является требованием. Хотя конечно, мне не очень хочется устанавливать себе Visual Studio.

Автор: Bose 22.3.2009, 18:55
DLL получилось собрать, установив lcc, и указав в настройках linker-a дополнительный файл fbclient_ms.lib. Работоспособность пока не тестировал.

Меня терзают смутные сомнения, что можно так вот запросто прилинковать либу от Ms C к коду скомпилированному в lcc, и всё после этого будет работать стабильно.

Господа гуру, покомментируйте пожалуйста эту ветку. А то я что-то делаю, но сам толком не понимаю что это значит. Спасибо.

Автор: Bose 24.3.2009, 13:27
up

Автор: zim22 24.3.2009, 13:57
Bose, smile
вы не там где надо тему создали.
http://forum.vingrad.ru/forum/topic-203039/anchor-entry/0.html#entry

Автор: bsa 24.3.2009, 14:51
Bose, вообще-то, сишные либы можно линковать к любым проектам под той же архитектурой. Это особенность Си. В Си++ этого нет - необходимо, чтобы компиляторы совпадали (даже версии).
А то, что у тебя скомпилировалось с помощью icc не удивительно - ты же подсунул недостающую либу. Если бы ты тоже самое под mingw сделал, то тоже бы не было ошибок.

Вот только данная тема отношения к си не имеет.

Автор: Bose 24.3.2009, 15:13
Цитата(zim22 @  24.3.2009,  12:57 Найти цитируемый пост)
Bose, smile
вы не там где надо тему создали.
http://forum.vingrad.ru/forum/topic-203039...ry/0.html#entry 

Я смотрел тот топик - там не используются функции isc_decode_date, и соответственно не возникает нужды линковаться к fbclient_xx.lib.

Цитата(bsa @  24.3.2009,  13:51 Найти цитируемый пост)
Вот только данная тема отношения к си не имеет. 

Насчёт раздела, на мой взгляд, вопрос в большей степени относится к Си(не к языку, а к инструментарию), чем к Firebird-у.


Цитата(bsa @  24.3.2009,  13:51 Найти цитируемый пост)
Bose, вообще-то, сишные либы можно линковать к любым проектам под той же архитектурой. Это особенность Си. В Си++ этого нет - необходимо, чтобы компиляторы совпадали (даже версии).
А то, что у тебя скомпилировалось с помощью icc не удивительно - ты же подсунул недостающую либу. Если бы ты тоже самое под mingw сделал, то тоже бы не было ошибок.

А что такое архитектура? OS? битность(32/64)? тип процессора(Intel/Celeron)?

Добавлено через 45 секунд
а в остальном, bsa, спасибо.

Автор: Bose 26.3.2009, 01:28
не тема, а футбольный мячик какой-то.  smile 

Решение под винду найдено. Ответили тут:

http://www.sql.ru/forum/actualthread.aspx?tid=649279#6970952

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)