GEOS 및 PostGIS를 사용하는 PostgreSQL 확장-정의되지 않은 기호 : lwgeom_geos_error

Bulva

튜토리얼을 기반으로 한 간단한 함수 인 PostgreSQL 확장을 작성하려고했습니다 . 작동하지만 GEOS 코드를 사용하는 확장을 작성하고 싶습니다. 그래서 Postgis 함수 ST_RelateMatch (하나 이상의 패턴 매개 변수에 대해) 에 따라 함수를 작성 했지만 컴파일 중에 문제가 발생했습니다 (아마도 링크와 관련).

이것은 C로 작성된 내 기능입니다.

#include "postgres.h"
#include "fmgr.h"
#include "funcapi.h"
#include "utils/builtins.h"

// here I had to add path to headers because I got fatal error: lwgeom_geos.h: No such file or directory
#include "./postgis-3.0.0/liblwgeom/lwgeom_geos.h"
#include "./postgis-3.0.0/libpgcommon/lwgeom_pg.h"

#include <string.h>
#include <assert.h>

/* #define POSTGIS_DEBUG_LEVEL 4 */

/* My RelateMatchFunction */
PG_MODULE_MAGIC;

PG_FUNCTION_INFO_V1(myrelatematch);

Datum myrelatematch(PG_FUNCTION_ARGS)
{
    char *mat, *pat;
    text *mat_text, *pat_text;
    int result, arg;

    mat_text = (PG_GETARG_TEXT_P(0));
    mat = text_to_cstring(mat_text);

    initGEOS(lwpgnotice, lwgeom_geos_error);

    for (arg=1; arg < PG_NARGS(); arg++)
    {
        if (!PG_ARGISNULL(arg))
        {
            pat_text = (PG_GETARG_TEXT_P(arg));
            pat = text_to_cstring(pat_text);

            result = GEOSRelatePatternMatch(mat, pat);
            if (result == 2)
            {
                lwfree(mat); lwfree(pat);
                lwpgerror("GEOSRelatePatternMatch: %s", lwgeom_geos_errmsg);
                PG_RETURN_NULL();
            } else if (result == 1)
            {
                lwfree(mat); lwfree(pat);
                PG_RETURN_BOOL(result);
            }
        }
    }
    PG_RETURN_BOOL(0);
}

그런 다음 Makefile튜토리얼에서 사용 했습니다.

MODULES = myrelatematch
EXTENSION = myrelatematch
DATA = myrelatematch--0.0.1.sql
PG_CONFIG = pg_config
PGXS := $(shell $(PG_CONFIG) --pgxs)
include $(PGXS)

그리고 이것은 내 SQL 코드입니다.

CREATE OR REPLACE FUNCTION
myrelatematch(text,variadic text[]) RETURNS int AS 'MODULE_PATHNAME','myrelatematch'
LANGUAGE C STRICT;

이제 makeUbuntu 18.04에서 실행하면 오류가 없습니다. 공유 객체를 생성합니다. 실행하면 sudo make install오류가 없지만 CREATE EXTENSION myrelatematch데이터베이스에서 실행하면 다음 오류가 발생합니다.

ERROR:  could not load library "/usr/lib/postgresql/11/lib/myrelatematch.so": /usr/lib/postgresql/11/lib/myrelatematch.so: undefined symbol: lwgeom_geos_error

Ubuntu 18.04를 실행 중이며 Postgis 용 모든 라이브러리가 서버에 있습니다 (소스에서 Postgis를 컴파일 할 수 있음). Postgresql 버전은 11.6 입니다.

나는 경험이 없으며 항상 소프트웨어의 더 큰 부분을 컴파일하는 데 문제가 있습니다. 라이브러리 연결에 문제가 있다고 생각했지만 하루 종일 디버깅을 마치고 도움이 필요합니다.

편집하다

gcc 명령을 복사하고 추가 -Wl,--no-undefined하면 링커에서 오류가 발생합니다.

/home/username/myrelatematch/myrelatematch.c:26: undefined reference to `pg_detoast_datum'
/home/username/myrelatematch/myrelatematch.c:27: undefined reference to `text_to_cstring'
/home/username/myrelatematch/myrelatematch.c:29: undefined reference to `lwgeom_geos_error'
/home/username/myrelatematch/myrelatematch.c:29: undefined reference to `lwpgnotice'
/home/username/myrelatematch/myrelatematch.c:29: undefined reference to `initGEOS'
/home/username/myrelatematch/myrelatematch.c:35: undefined reference to `pg_detoast_datum'
/home/username/myrelatematch/myrelatematch.c:36: undefined reference to `text_to_cstring'
/home/username/myrelatematch/myrelatematch.c:38: undefined reference to `GEOSRelatePatternMatch'
/home/username/myrelatematch/myrelatematch.c:46: undefined reference to `lwfree'
/home/username/myrelatematch/myrelatematch.c:46: undefined reference to `lwfree'
/home/username/myrelatematch/myrelatematch.c:41: undefined reference to `lwfree'
/home/username/myrelatematch/myrelatematch.c:41: undefined reference to `lwfree'
/home/username/myrelatematch/myrelatematch.c:42: undefined reference to `lwgeom_geos_errmsg'
/home/username/myrelatematch/myrelatematch.c:42: undefined reference to `lwpgerror'

추가하면 -L/home/username/myrelatematch/postgis-3.0.0/liblwgeom변경 사항이없고 오류는 동일합니다.

다음은 완전한 gcc 명령입니다.

gcc -Wall -Wmissing-prototypes -Wpointer-arith -Wdeclaration-after-statement -Wendif-labels -Wmissing-format-attribute -Wformat-security -fno-strict-aliasing -fwrapv -fexcess-precision=standard -Wno-format-truncation -g -g -O2 -fstack-protector-strong -Wformat -Werror=format-security -fno-omit-frame-pointer -fPIC -L/usr/lib/x86_64-linux-gnu -Wl,-Bsymbolic-functions -Wl,-z,relro -Wl,-z,now -L/usr/lib/llvm-6.0/lib  -L/usr/lib/x86_64-linux-gnu/mit-krb5 -Wl,--as-needed -L/home/username/myrelatematch/postgis-3.0.0/liblwgeom -Wl,--no-undefined -shared -o myrelatematch.so myrelatematch.o
Bulva

이러한 질문을 기반으로 ( pgxs 질문-c 함수를 외부 라이브러리에 연결 하고 PGXS는 모듈을 연결할 때 SHLIB_LINK를 무시합니다 ) 솔루션을 찾았습니다.

다음은 타사 라이브러리가있는 Makefile의 예입니다.

그리고 내 메이크위한 GEOS, 라이브러리 :LIBLWGEOMLIBPGCOMMON

EXTENSION = vectgen        
DATA = vectgen--0.0.1.sql  
OBJS = vectgen.o
MODULE_big = vectgen

# postgres build stuff
SHLIB_LINK = -lgeos_c -llwgeom -lpgcommon
PG_LDFLAGS += -L /home/username/CLionProjects/test_geos/libpgcommon
PG_CPPFLAGS = -I /home/username/CLionProjects/test_geos/libpgcommon
PG_CONFIG = pg_config
PGXS := $(shell $(PG_CONFIG) --pgxs)
include $(PGXS)

나는 변화가 MODULES에 대한 MODULE_big다음 SHLIB_LINK있도록 편집에 고려 -l플래그 라이브러리를 사용할 수 있습니다. 그 후 libpgcommonPostGIS에서 내 프로젝트로 복사 하고 PG_LDFLAGS.

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

OpenCV C API를 사용하여 Python 확장이있는 정의되지 않은 기호

분류에서Dev

Django GEOS의 PostGIS ST_MakeValid와 동일

분류에서Dev

사용자 지정 확인되지 않은 예외는 throw 및 호출자 메서드를 반환하지 않습니다.

분류에서Dev

for 순환 및 문자열 선택기를 사용하는 정의되지 않은 ajax 게시물

분류에서Dev

선형 및 이진을 사용하지 않고 정렬되지 않은 배열의 가장 큰 수 찾기

분류에서Dev

루비 기본 확장 : 정의되지 않은 기호

분류에서Dev

다른 클래스의 신호 및 슬롯 PyQt5를 사용하여 정의되지 않은 URL

분류에서Dev

PHP 및 ImageMagick을 사용하여 이미지의 크기를 재귀 적으로 조정하고 이름을 지정할 때 기존 파일 이름 및 확장자를 기반으로 새 파일을 작성하는 가장 좋은 방법

분류에서Dev

Django의 GEOS API에서 기하학적 교차가 더 이상 작동하지 않습니다.

분류에서Dev

C API를 사용하여 GEOS Polygon의 점을 반복합니다.

분류에서Dev

ajax 및 PHP를 사용하는 동안 정의되지 않은 색인 문제

분류에서Dev

PyOpenGL :: OpenGL.error.NullFunctionError : 정의되지 않은 함수 glutInit 호출 시도, 호출하기 전에 bool (glutInit) 확인

분류에서Dev

대괄호 및 &&를 사용하는 예기치 않은 jx

분류에서Dev

Mongoose 및 TTL로 확인되지 않은 사용자를 제거하는 방법

분류에서Dev

PostgreSQL은 PostGIS를 사용하지 않고 두 지점 사이의 거리를 계산합니다.

분류에서Dev

Yii의 무한 스크롤 호출기 확장은 호출기를 표시하지 않습니다.

분류에서Dev

정의되지 않은 기호의 genymotion 오류를 수정하는 방법 : drmGetDevice?

분류에서Dev

사용자 이름 및 암호 필드를 확인하고 그에 따라 완료되지 않으면 중지하는 Javascript 기능

분류에서Dev

확장되지 않도록 libGDX를 사용하여 스플래시 화면의 크기를 조정하고 페이드하는 가장 좋은 방법은 무엇입니까?

분류에서Dev

확장 정의를 사용하고 여러 유효성 검사기와 호환되는 방식으로 추가 속성을 허용하지 않으려면 어떻게해야합니까 (JSON 스키마 초안 7)?

분류에서Dev

Ubuntu 18.04 : Dash에서 패널 확장으로 글꼴 및 크기를 사용자 지정하는 방법은 무엇입니까?

분류에서Dev

정의되지 않은 사용되지 않은 외부 기호에 대한 오류를보고하도록 gcc를 얻는 방법

분류에서Dev

CSS 의사 선택기를 사용하는 일관되지 않은 동작 : 기회 div 위치 확인

분류에서Dev

bigarray를 사용한 Ocaml / C interop : '정의되지 않은 기호 : caml_ba_alloc'

분류에서Dev

폴더 구조를 사용할 때 C ++ 정의되지 않은 기호

분류에서Dev

gtest –– TEST_F를 사용할 때 정의되지 않은 기호

분류에서Dev

react 및 typescript를 사용하여 정의되지 않은 값을 구체적으로 확인하지 않을 때 조건이 false로 평가되지 않는 이유는 무엇입니까?

분류에서Dev

CMAKE를 사용하는 " 'FT_Load_Glyph'에 대한 정의되지 않은 참조"및 기타 SDL2_ttf 함수

분류에서Dev

postgresql 및 django를 사용하여 지리 정보를 저장하는 데 가장 적합한 모듈은 무엇입니까?

Related 관련 기사

  1. 1

    OpenCV C API를 사용하여 Python 확장이있는 정의되지 않은 기호

  2. 2

    Django GEOS의 PostGIS ST_MakeValid와 동일

  3. 3

    사용자 지정 확인되지 않은 예외는 throw 및 호출자 메서드를 반환하지 않습니다.

  4. 4

    for 순환 및 문자열 선택기를 사용하는 정의되지 않은 ajax 게시물

  5. 5

    선형 및 이진을 사용하지 않고 정렬되지 않은 배열의 가장 큰 수 찾기

  6. 6

    루비 기본 확장 : 정의되지 않은 기호

  7. 7

    다른 클래스의 신호 및 슬롯 PyQt5를 사용하여 정의되지 않은 URL

  8. 8

    PHP 및 ImageMagick을 사용하여 이미지의 크기를 재귀 적으로 조정하고 이름을 지정할 때 기존 파일 이름 및 확장자를 기반으로 새 파일을 작성하는 가장 좋은 방법

  9. 9

    Django의 GEOS API에서 기하학적 교차가 더 이상 작동하지 않습니다.

  10. 10

    C API를 사용하여 GEOS Polygon의 점을 반복합니다.

  11. 11

    ajax 및 PHP를 사용하는 동안 정의되지 않은 색인 문제

  12. 12

    PyOpenGL :: OpenGL.error.NullFunctionError : 정의되지 않은 함수 glutInit 호출 시도, 호출하기 전에 bool (glutInit) 확인

  13. 13

    대괄호 및 &&를 사용하는 예기치 않은 jx

  14. 14

    Mongoose 및 TTL로 확인되지 않은 사용자를 제거하는 방법

  15. 15

    PostgreSQL은 PostGIS를 사용하지 않고 두 지점 사이의 거리를 계산합니다.

  16. 16

    Yii의 무한 스크롤 호출기 확장은 호출기를 표시하지 않습니다.

  17. 17

    정의되지 않은 기호의 genymotion 오류를 수정하는 방법 : drmGetDevice?

  18. 18

    사용자 이름 및 암호 필드를 확인하고 그에 따라 완료되지 않으면 중지하는 Javascript 기능

  19. 19

    확장되지 않도록 libGDX를 사용하여 스플래시 화면의 크기를 조정하고 페이드하는 가장 좋은 방법은 무엇입니까?

  20. 20

    확장 정의를 사용하고 여러 유효성 검사기와 호환되는 방식으로 추가 속성을 허용하지 않으려면 어떻게해야합니까 (JSON 스키마 초안 7)?

  21. 21

    Ubuntu 18.04 : Dash에서 패널 확장으로 글꼴 및 크기를 사용자 지정하는 방법은 무엇입니까?

  22. 22

    정의되지 않은 사용되지 않은 외부 기호에 대한 오류를보고하도록 gcc를 얻는 방법

  23. 23

    CSS 의사 선택기를 사용하는 일관되지 않은 동작 : 기회 div 위치 확인

  24. 24

    bigarray를 사용한 Ocaml / C interop : '정의되지 않은 기호 : caml_ba_alloc'

  25. 25

    폴더 구조를 사용할 때 C ++ 정의되지 않은 기호

  26. 26

    gtest –– TEST_F를 사용할 때 정의되지 않은 기호

  27. 27

    react 및 typescript를 사용하여 정의되지 않은 값을 구체적으로 확인하지 않을 때 조건이 false로 평가되지 않는 이유는 무엇입니까?

  28. 28

    CMAKE를 사용하는 " 'FT_Load_Glyph'에 대한 정의되지 않은 참조"및 기타 SDL2_ttf 함수

  29. 29

    postgresql 및 django를 사용하여 지리 정보를 저장하는 데 가장 적합한 모듈은 무엇입니까?

뜨겁다태그

보관