Модераторы: LSD
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Си функции, dll, проблема линковки 
:(
    Опции темы
AlexeyChe
Дата 27.11.2009, 11:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Всем доброго дня
Мучаюсь уже с 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


PM MAIL   Вверх
djamshud
Дата 27.11.2009, 13:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Пердупержденный
***


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

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



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


--------------------
'Cuz I never walk away from what I know is right
Alice Cooper - Freedom
PM   Вверх
AlexeyChe
Дата 27.11.2009, 13:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



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
PM MAIL   Вверх
djamshud
Дата 27.11.2009, 13:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Пердупержденный
***


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

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



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.


--------------------
'Cuz I never walk away from what I know is right
Alice Cooper - Freedom
PM   Вверх
AlexeyChe
Дата 30.11.2009, 17:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



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  аналогичные ошибки

PM MAIL   Вверх
djamshud
Дата 30.11.2009, 17:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Пердупержденный
***


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

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



Допустим:
C:\pgsql\lib - каталог с дллкой postgres.dll.

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

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

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


--------------------
'Cuz I never walk away from what I know is right
Alice Cooper - Freedom
PM   Вверх
AlexeyChe
Дата 1.12.2009, 15:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



djamshud, спасибо, заработало
я знал что надо примерно как то так линковать, но как точно так и не понял, теперь ясно =)
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PostgreSQL | Следующая тема »


 




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


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

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