Ich versuche, sowohl eine externe PostgreSQL
Funktion auf OSX 10.11
mit clang
zu bauen und gcc
, aber Link fehlgeschlagen mit den folgenden Fehlern:PostgreSQL externer C-Funktion Link fehlgeschlagen auf Mac OSX
c++ -I/usr/local/Cellar/postgresql/9.5.3/include/server -fpic -c ./main.c
c++ -shared -o ttt.dylib main.o
Undefined symbols for architecture x86_64:
"_deconstruct_array", referenced from:
_psql_nearest in main.o
"_elog_finish", referenced from:
_psql_nearest in main.o
"_elog_start", referenced from:
_psql_nearest in main.o
"_get_typlenbyvalalign", referenced from:
_psql_nearest in main.o
"_pfree", referenced from:
_psql_nearest in main.o
"_pg_detoast_datum", referenced from:
_psql_nearest in main.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
Es sieht so aus, als müsste ich meine Bibliothek mit einigen PostgreSQL
Bibliotheken verknüpfen. Was sind diese Bibliotheken?
main.cpp:
extern "C" {
#include <postgres.h>
#include <fmgr.h>
#include <utils/array.h>
#include <utils/lsyscache.h>
#include <catalog/pg_type.h>
#ifdef PG_MODULE_MAGIC
PG_MODULE_MAGIC;
#endif
PG_FUNCTION_INFO_V1(psql_nearest);
Datum psql_nearest(PG_FUNCTION_ARGS) {
if(PG_ARGISNULL(0) || PG_ARGISNULL(1)) {
elog(ERROR, "DOC2VEC: NULL INPUT DATA");
PG_RETURN_NULL();
}
ArrayType *_docVector = PG_GETARG_ARRAYTYPE_P(0);
Oid elTypeVals = ARR_ELEMTYPE(_docVector);
if (elTypeVals != FLOAT4OID) {
elog(ERROR, "DOC2VEC: INVALID INPUT DATA TYPE");
PG_RETURN_NULL();
}
int16 typeLenVals = 0;
bool typeByValVals = false;
char typeAlignVals = char(0);
get_typlenbyvalalign(elTypeVals, &typeLenVals, &typeByValVals, &typeAlignVals);
Datum *inputVals;
bool *nullVals;
int nVals;
deconstruct_array(_docVector, elTypeVals, typeLenVals, typeByValVals, typeAlignVals, &inputVals, &nullVals, &nVals);
pfree(inputVals);
pfree(nullVals);
PG_RETURN_NULL();
}
}
Nur um 100% klar zu sein: Ihre Bearbeitung hat die Quellcodedatei von 'main.c' in' main.cpp' geändert, aber der 'cc' Befehl oben hat immer noch' main.c'. Das sollte auch 'main.cpp' sein, oder? Oder haben Sie nur den Namen geändert, um den 'externen 'C'-Teil zu erklären, aber der eigentliche Dateiname ist' main.c'. Das wird verwirrend sein. – Evert
Versuchen Sie unter anderem, mit 'pgcommon' zu verlinken. 'pgfree lebt dort '. – Evert
Ja, ich habe 'main.c' in' main.cpp' und 'cc' in' C++ 'geändert, um zu erklären, warum ich' extern "C" brauche. Ich versuchte (erfolglos), mit 'pgcommon',' pgtypes', 'pgport' und' libpq' zu verbinden –