Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PostgreSQL > Си функции, dll, проблема линковки


Автор: AlexeyChe 27.11.2009, 11:53
Всем доброго дня
Мучаюсь уже с dll'ками не первый день, ступор в линковке, компиляция кода проходит успешно. Пример кода:
Код

#include "postgres.h"
#include "fmgr.h"

#ifdef PG_MODULE_MAGIC
PG_MODULE_MAGIC;
#endif

PG_FUNCTION_INFO_V1(fo);

__declspec (dllexport) Datum fo(PG_FUNCTION_ARGS)
{

    float8   arg = PG_GETARG_FLOAT8(0);
    arg = arg+1;
    PG_RETURN_FLOAT8(arg);

}

PG_FUNCTION_INFO_V1(add_one);
         
__declspec (dllexport) Datum add_one(PG_FUNCTION_ARGS)
{
    int32   arg = PG_GETARG_INT32(0);

    PG_RETURN_INT32(arg + 1);
}


ошибка:
Код

dllmain.o(.text+0x36):dllmain.c: undefined reference to `Float8GetDatum'
collect2: ld returned 1 exit status


почему не проходит линковка...для меня остается чем-то за гранью познанного, потому что ладно бы ругался на все макросы, которые я здесь использую, ну там на Int32GetDatum например, ему не нравится только Float8
Да, причем стоит закомментировать функцию с float8, оставив только int32 - add_one, то dll работает

Бинарники постгрес от 8.4
сборка через Мингв в Dev-cpp, WinXP


Автор: djamshud 27.11.2009, 13:07
Float8GetDatum - функция, которая получается при раскрытии одного из макросов. Макросы успешно раскрываются, потому что описаны в подключаемых .h файлах. А вот реализации функции линковщик не видет. Линкуйте с постгресной библиоткой.

Автор: AlexeyChe 27.11.2009, 13:25
djamshud, я линковал все основные библиотеки бинарников постгрес
Код

gcc.exe -c dllmain.c -o dllmain.o -I"C:/Dev-Cpp/include"  -DBUILDING_DLL=1  -I c:/pgsql/include -I c:/pgsql/include/server -I c:/pgsql/include/server/port/win32 -I C:\Dev-Cpp\include\c++\3.4.2 dllwrap.exe --output-def libdll_c_v1.def --implib libdll_c_v1.a dllmain.o  -L"C:/Dev-Cpp/lib" -L "c:/pgsql/include" --no-export-all-symbols --add-stdcall-alias  -o dll_c_v1.dll


может подключить ещё какую нибудь папку? такую чтоб с float8

да и вообще странно, сомневаюсь что описание Int32GetDatum лежит где нибудь далеко от аналогичного описания float8

Автор: djamshud 27.11.2009, 13:51
dllwrap.exe --output-def libdll_c_v1.def --implib libdll_c_v1.a dllmain.o  -L"C:/Dev-Cpp/lib" -L "c:/pgsql/include" --no-export-all-symbols --add-stdcall-alias  -o dll_c_v1.dll

Не видно, чтобы вы линковали программу с постгресной либой.

-L"c:/pgsql/include" этим вы сказали, где находятся либы, но не указали, какие именно подключать.

PS. с папочкой include вы наверное тоже ошиблись. Скорее всего что-нибудь вроде lib или bin.

Автор: AlexeyChe 30.11.2009, 17:38
djamshud, Доброго времени суток

Очень похоже на правду то что Вы сказали, только вот проблема не решилась
Нашел в документации что Float8GetDatum описан в postgres.lib библиотечке, пытался её линковать,
от отчаяния конвертнул postgres.lib -> postgres.dll, проверил Dependency Walkerom наличие сей функции, она как и ожидалось там присутствует, только вот толку ноль. 
Я, наверное, не правильно линкую библиотеку?

Код

dllwrap.exe --output-def libdll_c_v1.def --implib libdll_c_v1.a dllmain.o  -L"C:/Dev-Cpp/lib" -l postgres.dll --no-export-all-symbols --add-stdcall-alias  -o dll_c_v1.dll

испробовал вроде всё:
-l "c:\pgsql\lib\postgres.dll"  //ошибка - cannot find -lc:\pgsql\lib\postgres.dll
--library "c:\pgsql\lib\postgres.dll"  // ld 1 Float8GetDatum - как и раньше

с .lib  аналогичные ошибки

Автор: djamshud 30.11.2009, 17:43
Допустим:
C:\pgsql\lib - каталог с дллкой postgres.dll.

Скомпилировали main.c в main.o

Линкуем:
gcc -o main main.o -L"c:\pgsql\lib" -lpostrges

Должно работать

Автор: AlexeyChe 1.12.2009, 15:43
djamshud, спасибо, заработало
я знал что надо примерно как то так линковать, но как точно так и не понял, теперь ясно =)

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