マックOSX上で失敗したが、リンクは次のエラーで失敗しました:PostgreSQLの外部C関数のリンクは、私が<code>clang</code>と<code>gcc</code>の両方で<code>OSX 10.11</code>に外部<code>PostgreSQL</code>機能を構築しようとしている
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)
ライブラリをPostgreSQL
ライブラリの一部とリンクする必要があるようです。これらのライブラリは何ですか?
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();
}
}
あなたの編集はソースコードファイルを 'main.c'から' main.cpp'に変更しましたが、一番上の 'cc'コマンドはまだ' main.c'を持っています。それは 'main.cpp'でもなければなりません。あるいは 'extern" C "の部分を説明するために名前を変更しましたが、実際のファイル名は' main.c'です。それは混乱するだろう。 – Evert
とりわけ、 'pgcommon'とのリンクを試みてください。 'pgfreeはそこに住んでいる '。 – Evert
はい、私は 'のextern "C"'セクションが必要なのか理由を説明するために、 'C++'に 'main.cpp'と' cc'に 'main.c'を変更しました。私はpgcommonにはDYN-libにはありません気付い 'pgcommon'、' pgtypes'、 'pgport'と' libpq' –