неопределенная ссылка на `palloc ' - PullRequest
0 голосов
/ 13 мая 2019

Я пытаюсь скомпилировать и связать пример функции из руководства PostgreSQL:

#include "postgres.h"   /* this includes directly palloc.h */
#include "fmgr.h"
#include "utils/geo_decls.h"    /* point type */

PG_MODULE_MAGIC;
PG_FUNCTION_INFO_V1(makepoint);
Datum makepoint(PG_FUNCTION_ARGS)
{
   Point *pointx = PG_GETARG_POINT_P(0);
   Point *pointy = PG_GETARG_POINT_P(1);
   Point *new_point = (Point *) palloc(sizeof(Point));
   new_point->x = pointx->x;
   new_point->y = pointy->y;
   PG_RETURN_POINT_P(new_point);
}

Я скомпилировал его командой:

cc -c -fPIC -DHAVE_LONG_LONG_INT_64 -I/C:/applications/PostgreSQL/11.2.2/include/server -I/C:/applications/PostgreSQL/11.2.2/include/server/port/win32 ../src/makepoint.c

по-видимому, он прекрасно компилируется, но при линковке:

cc -shared -o makepoint.so makepoint.o

Возникает следующая ошибка:

makepoint.o:makepoint.c:(.text+0x44): undefined reference to `palloc'
collect2.exe: error: ld returned 1 exit status

Компилятор

cc.exe (Rev1, Built by MSYS2 project) 8.2.1 20181207
installed in MSYS on Windows 10.

(та же ошибка возникает с gcc или g ++)
Пожалуйста, помогите мне понять, что я делаю по ошибке. Заранее спасибо.

Ответы [ 2 ]

4 голосов
/ 13 мая 2019

Хотя вы правильно включили заголовки, необходимые для компиляции с библиотекой PostgreSQL, вы не связываете ни одну из разделяемых библиотек, необходимых для создания конечного исполняемого файла. Вы должны изменить свою окончательную команду компиляции на что-то вроде следующего для gcc в Linux:

cc -c -fPIC makepoint.c -o makepoint.o
cc -shared --relocatable -o libmakepoint.so makepoint.o
cc -L/usr/local/pgsql/lib -lpq -L. -lmakepoint -o myapp.exe main.c

Затем вам нужно будет убедиться, что ваш локальный каталог, в котором находится libmakepoint.so, доступен для динамического компоновщика во время выполнения, либо определив путь в LD_LIBRARY_PATH вашей среды, либо добавив конфигурацию в ld_config. Вы можете прочитать больше об этом процессе здесь .

Обратите внимание, что ваши установочные каталоги могут отличаться в зависимости от того, как вы установили PostgreSQL, а также от вашей платформы, но, поскольку вы используете MSYS2, вы сможете установить pkg-config и использовать различные --cflags , --includedir, --libs и --libdir команды, чтобы получить соответствующие каталоги поиска и имена библиотек для ссылки. Например:

pkg-config --libs libpq

выведет (в зависимости от вашей конфигурации):

-L/usr/local/pgsql/lib -lpq

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

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

0 голосов
/ 17 мая 2019

Вы поставили параметр -fPIC на неправильном этапе построения общего объекта. Он должен идти на этапе связывания, а не на этапе компиляции. Вот так ...

cc -fPIC -shared -o makepoint.so makepoint.o
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...