C로 작성된 기능은 동적으로 컴파일 될 수 있습니다 로드 가능한 객체 (공유 라이브러리라고도 함) 사용자 정의 SQL 기능을 구현하십시오. 처음 a 특정로드 가능한 객체 파일의 사용자 정의 함수는 다음과 같습니다 백엔드 세션에서 호출 된 동적 로더가 해당 객체를로드합니다. 함수를 호출 할 수 있도록 메모리에 파일을 파일하십시오. 그만큼기능 만들기사용자 정의 따라서 함수는 기능 :로드 가능한 객체 파일의 이름과 C 이름 해당 개체 내에서 호출 할 특정 함수의 (링크 기호) 파일. C 이름이 명시 적으로 지정되지 않은 경우 SQL 기능 이름과 동일하다고 가정합니다.
참고 :처음으로 사용 된 후 a 동적으로로드 된 사용자 기능은 메모리에 유지됩니다 같은 세션에서 기능에 대한 향후 전화는 심볼 테이블 조회의 작은 오버 헤드가 발생합니다.
개체 파일을 지정하는 문자열 (첫 번째 문자열 AS 조항)은이어야합니다.전체 경로OF 단일 견적으로 괄호로 된 함수의 객체 코드 파일 점수. AS 절에 링크 기호가 주어지면 링크 기호는 또한 단일 견적 자국으로 괄호로 묶어야하며 C 소스의 함수 이름과 정확히 동일합니다. 암호. 유닉스 시스템에서 명령nm의지 동적으로로드 가능한 모든 링크 기호를 인쇄합니다. 물체.
참고 : 토토 사이트 순위기능을 자동으로 컴파일하지 않습니다. 그럴 것입니다 Create Function 명령에 사용되기 전에 컴파일됩니다. 보다 추가 정보는 아래에 있습니다.
현재 두 가지 다른 전화 규칙이 c 기능. 새로운 "버전 1"통화 컨벤션이 표시됩니다 A를 작성함으로써pg_function_info_v1 ()매크로 아래 그림과 같이 기능을 요청하십시오. 그러한 매크로의 부족 구식 ( "버전 0") 함수를 나타냅니다. 언어 이름 Create function에 지정된 경우 두 경우 모두 'C'입니다. 구식 이식성 문제로 인해 기능이 더 이상 사용되지 않습니다 기능 부족이지만 여전히 지원됩니다 호환성 이유.
다음 표는 매개 변수에 필요한 C 유형을 제공합니다. postgres에로드 될 C 함수에서. 그만큼 "정의 된"열에는 실제 헤더 파일이 제공됩니다 (.../src/backend/디렉토리) 동등한 C 유형이 정의됩니다. 항상해야합니다 포함하다토토 사이트 순위.h먼저 턴 포함C.H.
표 13-1. 내장에 대한 동등한 C 유형토토 사이트 순위타입
내장 유형 | C 유형 | 정의 |
---|---|---|
Abstime | AbsoluteTime | utils/nabstime.h |
bool | bool | 포함/c.h |
Box | (Box *) | utils/geo-decls.h |
BYTEA | (Bytea *) | 포함/토토 사이트 순위.h |
"char" | char | N/A |
CID | CID | 포함/토토 사이트 순위.h |
dateTime | (DateTime *) | 포함/c.h 또는 포함/토토 사이트 순위.h |
int2 | int2 또는 int16 | 포함/토토 사이트 순위.h |
int2vector | (int2vector *) | 포함/토토 사이트 순위.h |
int4 | int4 또는 int32 | 포함/토토 사이트 순위.h |
float4 | (float4 *) | 포함/c.h 또는 포함/토토 사이트 순위.h |
float8 | (float8 *) | 포함/c.h 또는 포함/토토 사이트 순위.h |
LSEG | (LSEG *) | 포함/geo-decls.h |
이름 | (이름) | 포함/토토 사이트 순위.h |
OID | OID | 포함/토토 사이트 순위.h |
oidvector | (oidvector *) | 포함/토토 사이트 순위.h |
PATH | (Path *) | utils/geo-decls.h |
포인트 | (Point *) | utils/geo-decls.h |
Regproc | Regproc 또는 Regproc | 포함/토토 사이트 순위.h |
Reltime | RelativeTime | utils/nabstime.h |
텍스트 | (텍스트 *) | 포함/토토 사이트 순위.h |
tid | ItemPointer | Storage/itemptr.h |
Timespan | (Timespan *) | 포함/c.h 또는 포함/토토 사이트 순위.h |
TinterVal | TimeInterval | utils/nabstime.h |
xid | (xid *) | 포함/토토 사이트 순위.h |
내부,토토 사이트 순위기본 유형을 "기억의 덩어리"로 간주합니다. 사용자 정의 유형을 차례로 정의하는 함수는 길을 정의합니다. 저것토토 사이트 순위작동 할 수 있습니다 그것. 즉,토토 사이트 순위의지 디스크에서 데이터를 저장하고 검색하고 사용하십시오. 데이터를 입력, 프로세스 및 출력 할 수있는 사용자 정의 기능. 기본 유형은 세 가지 내부 형식 중 하나를 가질 수 있습니다.
통과 가치, 고정 길이
참조 별 통과, 고정 길이
참조별로 전달, 가변 길이
바이 값 유형은 길이가 1, 2 또는 4 바이트 일 수 있습니다 (또한 8 바이트, 크기 (Datum)가 컴퓨터에서 8 인 경우). 당신은해야합니다 동일하게 유형을 정의하도록주의하십시오. 모든 아키텍처에서 크기 (바이트). 예를 들어,Long타입은 4이기 때문에 위험합니다 일부 기계의 바이트, 다른 기계의 8 바이트, 반면int타입은 대부분의 유닉스에서 4 바이트입니다 기계 (대부분의 개인용 컴퓨터는 아니지만). 합리적 구현int4켜기를 입력하십시오 유닉스 머신은 다음과 같습니다.
/ * 4-byte 정수, 가치에 의해 통과 */ typedef int int4;
반면에 모든 크기의 고정 길이 유형이 회의 별 통과. 예를 들어 샘플이 있습니다 A 구현토토 사이트 순위유형 :
/ * 16 바이트 구조, 참조로 통과 */ typedef struct 더블 X, y; 가리키다;
전달할 때 그러한 유형에 대한 포인터 만 사용할 수 있습니다. 그리고토토 사이트 순위기능. 그러한 유형의 값을 반환하려면 올바른 양을 할당하십시오. 메모리palloc ()를 채우십시오 메모리를 할당하고 포인터를 반환합니다. (또는 또는 반환하여 동일한 유형의 입력 값을 반환 할 수 있습니다. 바늘.절대a의 내용을 수정하십시오 그러나 추천 입력 값을 통과합니다.)
마지막으로 모든 가변 길이 유형도 전달해야합니다 참조. 모든 가변 길이 유형은 길이로 시작해야합니다 정확히 4 바이트의 필드 및 그 안에 저장 될 모든 데이터 유형은 그 다음에 메모리에 위치해야합니다. 길이 필드. 길이 필드는 총 길이입니다 구조 (즉, 길이 필드의 크기를 포함합니다. 그 자체). 텍스트 유형을 다음과 같이 정의 할 수 있습니다.
typedef struct int4 길이; 숯 데이터 [1]; 텍스트;
분명히 여기에 표시된 데이터 필드는 충분히 길지 않습니다. 가능한 모든 현을 붙잡고; 그러한 것을 선언하는 것은 불가능합니다 구조C. 조작 할 때 가변 길이 유형, 우리는 할당하기 위해주의해야합니다 메모리의 양을 올바르게하고 길이 필드를 초기화합니다. 을 위한 예를 들어, 텍스트 구조에 40 바이트를 저장하려면 다음과 같은 코드 조각을 사용할 수 있습니다.
#include "토토 사이트 순위.h" ... 숯 버퍼 [40]; / * 소스 데이터 */ ... 텍스트 *대상 = (텍스트 *) palloc (varhdrsz + 40); 대상- 길이 = varhdrsz + 40; Memmove (대상- 데이터, 버퍼, 40); ...
이제 우리는 가능한 모든 구조를 살펴 보았습니다. 기본 유형, 실제 기능의 몇 가지 예를 보여줄 수 있습니다.
우리는를 발표합니다."구식"컨벤션을 먼저 호출합니다 더 이상 사용되지 않으면 처음에 처리하는 것이 더 쉽습니다. 에서 버전 -0 메소드, C 함수의 인수 및 결과 정상적인 C 스타일로 방금 선언되지만 사용에주의를 기울입니다. 위와 같이 각 SQL 데이터 유형의 C 표현.
여기 몇 가지 예가 있습니다.
#include "토토 사이트 순위.h" #include <string.h / * 가치 별 */ int add_one (int arg) 반환 Arg + 1; / * 참조로 고정 길이 */ float8 * add_one_float8 (float8 *arg) float8 *result = (float8 *) palloc (sizeof (float8)); *결과 = *arg + 1.0; 반환 결과; 가리키다 * MakePoint (point *pointx, point *pointy) 지점 *new_point = (point *) palloc (sizeof (point)); new_point- x = pointx- x; new_point- y = pointy- y; New_Point를 반환합니다. / * 참조적으로 가변 길이 */ 텍스트 * 카피 텍스트 (텍스트 *t) /* * varsize는 바이트의 구조물의 총 크기입니다. */ 텍스트 *new_t = (텍스트 *) palloc (varsize (t)); varatt_sizep (new_t) = varsize (t); /* * Vardata는 구조물의 데이터 영역에 대한 포인터입니다. */ memcpy ((void *) vardata (new_t), / *대상 * / (void *) vardata (t), / *소스 * / varsize (t) -varhdrsz); / * 얼마나 많은 바이트 */ 뉴 _t를 반환합니다. 텍스트 * concat_text (text *arg1, text *arg2) int32 new_text_size = varsize (arg1) + varsize (arg2) - varhdrsz; 텍스트 *new_text = (텍스트 *) palloc (new_text_size); varatt_sizep (new_text) = new_text_size; memcpy (vardata (new_text), vardata (arg1), varsize (arg1) -varhdrsz); memcpy (vardata (new_text) + (varsize (arg1) -varhdrsz), vardata (arg2), varsize (arg2) -varhdrsz); new_text를 반환합니다.
위의 코드가 파일에서 준비되었다고 가정funcs.c공유로 편집했습니다 객체, 우리는 함수를 정의 할 수 있습니다토토 사이트 순위다음과 같은 명령과 함께 :
함수 생성 add_one (int4)은 int4를 반환합니다 처럼 'pgroot/tutorial/funcs.so 'Language'C ' (isstrict)와 함께; - SQL 기능 이름의 과부하 참고 add_one () 함수 add_one (float8)을 생성합니다 처럼 'pgroot/tutorial/funcs.so ', 'add_one_float8' 언어 'c'가있는 (isstrict); 함수 makepoint (점, 점)를 반환합니다 처럼 'pgroot/tutorial/funcs.so 'Language'C ' (isstrict)와 함께; 함수 CopyText (텍스트)를 작성합니다 텍스트를 반환합니다 처럼 'pgroot/tutorial/funcs.so 'Language'C ' (isstrict)와 함께; CONCIT CONCAT_TEXT (텍스트, 텍스트) 텍스트를 반환합니다 처럼 'pgroot/tutorial/funcs.so 'Language'C ' (isstrict);
여기pgroot에 대한 전체 경로토토 사이트 순위소스 트리. 시스템, 파일 이름에 따라 공유 객체가 끝나지 않을 수 있습니다.so하지만.SL또는 다른 것; 그에 따라 적응합니다.
기능을 "엄격한"것으로 지정했음을 알 수 있습니다. 시스템은 자동으로 널을 가정해야합니다 결과 입력 값이 NULL 인 경우 결과. 이렇게함으로써 우리는 피합니다 함수 코드에서 널 입력을 확인해야합니다. 없이 이것은 예를 들어 널을 명시 적으로 확인해야합니다. 각 패스 바이 회의에 대한 널 포인터를 확인합니다 논쟁. (패스 별 값 주장의 경우, 우리는조차 없습니다 확인 방법!)
이 호출 대회는 사용하기가 간단하지만 매우 휴대 성; 일부 아키텍처에는 문제가 있습니다 INT보다 작은 데이터 유형을 이런 식으로 전달합니다. 또한 아무도 없습니다 널 결과를 반환하거나 널에 대처하는 간단한 방법 기능을 엄격하게 만드는 것 외에 다른 방식으로 논쟁. 그만큼 다음에 발표 된 버전 -1 컨벤션은 이것을 극복합니다 이의 제기.
버전 -1 컨벤션은 매크로에 의존합니다 통과 된 주장의 복잡성을 억제하고 결과. 버전 -1 기능의 C 선언은 다음과 같습니다 언제나
Datum funcname (pg_function_args)또한 매크로 호출
pg_function_info_v1 (funcname);동일한 소스 파일에 나타나야합니다 (일반적으로 함수 자체 바로 앞에 쓰여진). 이 매크로 호출은 아닙니다 토토 사이트 순위 이후 "내부"-언어 기능에 필요합니다 모든 내부 기능이 버전 -1이라고 가정합니다. 그러나필수동적으로로드 된 함수의 경우.
버전 -1 함수에서는 각 실제 인수가 가져옵니다 a 사용pg_getarg_xxx()Argument의 데이터 유형 및 결과는 a를 사용하여 반환됩니다.pg_return_xxx()반환 유형의 매크로.
여기서 우리는 Version-1에 코딩 된 위와 동일한 함수를 보여줍니다. 스타일:
#include "토토 사이트 순위.h" #include <string.h #include "fmgr.h" / * 가치 별 */ pg_function_info_v1 (add_one); 자료 add_one (pg_function_args) int32 arg = pg_getarg_int32 (0); pg_return_int32 (arg + 1); / * 참조로 고정 길이 */ pg_function_info_v1 (add_one_float8); 자료 add_one_float8 (pg_function_args) / * float8에 대한 매크로는 패스 바로 회의 특성을 숨 깁니다 */ float8 arg = pg_getarg_float8 (0); pg_return_float8 (arg + 1.0); pg_function_info_v1 (makepoint); 자료 makepoint (pg_function_args) / * 여기서, 포인트의 추천 특성은 숨겨져 있지 않습니다 */ point *pointx = pg_getarg_point_p (0); point *pointy = pg_getarg_point_p (1); 지점 *new_point = (point *) palloc (sizeof (point)); new_point- x = pointx- x; new_point- y = pointy- y; pg_return_point_p (new_point); / * 참조적으로 가변 길이 */ pg_function_info_v1 (CopyText); 자료 CopyText (pg_function_args) 텍스트 *t = pg_getarg_text_p (0); /* * varsize는 바이트의 구조물의 총 크기입니다. */ 텍스트 *new_t = (텍스트 *) palloc (varsize (t)); varatt_sizep (new_t) = varsize (t); /* * Vardata는 구조물의 데이터 영역에 대한 포인터입니다. */ memcpy ((void *) vardata (new_t), / *대상 * / (void *) vardata (t), / *소스 * / varsize (t) -varhdrsz); / * 얼마나 많은 바이트 */ pg_return_text_p (new_t); pg_function_info_v1 (concat_text); 자료 concat_text (pg_function_args) 텍스트 *arg1 = pg_getarg_text_p (0); 텍스트 *arg2 = pg_getarg_text_p (1); int32 new_text_size = varsize (arg1) + varsize (arg2) - varhdrsz; 텍스트 *new_text = (텍스트 *) palloc (new_text_size); varatt_sizep (new_text) = new_text_size; memcpy (vardata (new_text), vardata (arg1), varsize (arg1) -varhdrsz); memcpy (vardata (new_text) + (varsize (arg1) -varhdrsz), vardata (arg2), varsize (arg2) -varhdrsz); pg_return_text_p (new_text);
the함수 만들기명령은 버전 -0 등가와 동일합니다.
언뜻보기에 버전 1 코딩 규칙이 나타날 수 있습니다 무의미한 모호함이되기 위해. 그러나 그들은 제안합니다 매크로가 불필요하게 숨길 수 있기 때문에 개선 횟수 세부 사항. 예를 들어 Coding add_one_float8에서는 아니요 Float8이 상당한 회의라는 점을 알아야합니다. 유형. 또 다른 예는 getarg 매크로입니다 가변 길이 유형은 페치를 처리 할 필요성을 숨 깁니다 "토스트"(압축 또는 외부) 값. 구식CopyTextandconcat_text위에 표시된 기능은 실제로입니다 구운 값이 있으면 잘못이 없기 때문입니다. 부르다PG_DETOAST_DATUM ()on 입력. (구식 동적으로로드 된 기능의 핸들러 현재이 세부 사항을 처리하지만 덜합니다. 버전 -1 기능에 대해 효율적으로 가능합니다.)
버전 -1 기능의 큰 개선이 더 좋습니다 널 입력 및 결과 처리. 매크로PG_ARGISNULL (N)함수를 테스트 할 수 있습니다 각 입력이 무효인지 여부 (물론, 이것을하는 것은 선언되지 않은 기능에 필요"엄격한"). 와 마찬가지로pg_getarg_xxx()매크로, 입력 인수는 0에서 시작됩니다. 에게 널 결과를 반환하고 실행pg_return_null (); 이것은 엄격한 것과 모두에서 작동합니다 비 스트릭 기능.
버전 -1 기능 호출 규칙을 통해 가능합니다 반품"set"결과 및 구현 트리거 기능 및 절차 적 통화 처리기. 버전 1 코드는 버전 -0보다 휴대가 가능합니다. 기능 통화 프로토콜에서 ANSI C 제한을 중단하지 않습니다. 자세한 내용은 참조src/backend/utils/fmgr/readme소스에서 분포.
복합 유형은 C와 같은 고정 레이아웃이 없습니다. 구조. 복합 유형의 인스턴스는 null을 포함 할 수 있습니다 전지. 또한 AN의 일부인 복합 유형 상속 계층 구조는 다른 필드와 다른 필드를 가질 수 있습니다 동일한 상속 계층의 구성원. 그러므로,토토 사이트 순위절차를 제공합니다 C에서 복합 유형의 필드에 액세스하기위한 인터페이스토토 사이트 순위세트를 처리합니다 행, 각 행은 불투명으로 기능으로 전달됩니다. 유형 구조튜플. 우리를 가정 해 봅시다 쿼리에 응답하기 위해 함수를 작성하고 싶습니다
이름, C_overpaid (EMP, 1500)를 초과 지불로 선택하십시오 emp에서 여기서 name = 'bill'또는 name = 'sam';위의 쿼리에서 c_overpaid를 다음과 같이 정의 할 수 있습니다.
#include "토토 사이트 순위.h" #include "executor/executor.h"/ * for getAttributeByName () */ 부 c_overpaid (tupletableslot *t, / *현재 행의 행 * / int32 한도) bool isnull; INT32 급여; Salary = DatumgetInt32 (getAttributeByName (t, "Salary", & isnull)); if (isnull) 반환 (거짓); 반품 급여 한도; / * 버전 -1 코딩에서 위는 다음과 같습니다. */ pg_function_info_v1 (c_overpaid); 자료 c_overpaid (pg_function_args) tupleTablesLot *t = (tupleTablesLot *) pg_getarg_pointer (0); int32 한계 = pg_getarg_int32 (1); bool isnull; INT32 급여; Salary = DatumgetInt32 (getAttributeByName (t, "Salary", & isnull)); if (isnull) pg_return_bool (false); / * 또는 널 급여에 대해 pg_return_null ()를 선호 할 수 있습니다 */ pg_return_bool (급여 한도);
getAttributeByName토토 사이트 순위시스템 기능 현재 행에서 속성을 반환합니다. 세 가지가 있습니다 인수 : 유형의 주장tupletableslot*이름, 이름으로 전달되었습니다 원하는 속성 및 반환 매개 변수의 속성이 null인지 여부.getAttributeByName기준 값을 반환합니다 적절한 사용으로 적절한 데이터 유형으로 변환 할 수 있습니다Datumgetxxx()매크로.
다음 쿼리가토토 사이트 순위c_overpaid기능 :
함수 만들기 c_overpaid (emp, int4) Bool을 반환합니다 처럼 'pgroot/tutorial/obj/funcs.so ' 언어 'C';
새 행을 구성하거나 수정하는 방법이 있습니다. C 함수 내에서 기존 행, 이것도 멀리 있습니다. 이 매뉴얼에서 논의하기 위해 복잡합니다.
우리는 이제 더 어려운 글쓰기 작업으로 돌아갑니다. 언어 기능 프로그래밍. 경고 :이 섹션 의이 부분 매뉴얼은 당신을 프로그래머로 만들지 않을 것입니다. 당신은 좋은 것이 있어야합니다 에 대한 이해C(포함 Pointers 및 Malloc 메모리 관리자 사용) 쓰다C토토 사이트 순위. 그럴 수도 있습니다 이외의 언어로 작성된 기능을로드 할 수 있습니다.Cin토토 사이트 순위, 이것은 종종 어렵다 (경우 와 같은 다른 언어이기 때문에 전혀 가능합니다.Fortran및Pascal종종 같은 것을 따르지 않습니다전화 컨벤션asC. 즉, 다른 언어는 통과하지 않습니다 같은 방식으로 함수 사이의 인수 및 반환 값. 이러한 이유로 우리는 귀하의 프로그래밍 언어가 함수는로 작성됩니다.C.
건축을위한 기본 규칙C함수는 다음과 같습니다.
관련 헤더 (포함) 파일은에 설치됩니다/usr/local/pgsql/include또는 동등한. 사용할 수 있습니다PG_CONFIG -includedir시스템의 위치를 찾으려면 (또는 사용자가 실행할 시스템). 을 위한 매우 낮은 수준의 작업 완전해야 할 수도 있습니다PostgreSQL소스 트리 사용 가능.
메모리를 할당 할 때를 사용하십시오.토토 사이트 순위루틴Palloc및pfree해당 대신C도서관 루틴Malloc및무료. 에 의해 할당 된 메모리Palloc해방됩니다 각 트랜잭션이 끝날 때 자동으로 방지합니다 메모리 누출.
항상 구조물의 바이트를 항상 0memset또는bzero. 여러 루틴 (해시 등 액세스 방법, 해시 조인 및 정렬 알고리즘) 계산 당신의 구조에 포함 된 원시 비트의 기능. 심지어 구조의 모든 필드를 초기화하면 정렬 패딩의 여러 바이트가 되십시오 (구멍에 쓰레기 값을 포함 할 수있는 구조)
대부분의 내부토토 사이트 순위유형은토토 사이트 순위.h관리자 인터페이스 (pg_function_args등)fmgr.h이므로 AT를 포함시켜야합니다 최소한이 두 파일. 휴대 할 수있는 이유로 가장 좋습니다 포함하다토토 사이트 순위.h 첫 번째, 다른 시스템 또는 사용자 앞에 헤더 파일. 포함토토 사이트 순위.hincludeC.H, elog.handPalloc.h당신을 위해.
객체 파일 내에 정의 된 기호 이름은 안됩니다 서로 충돌하거나에 정의 된 기호와 충돌PostgreSQL서버 실행 파일. 당신은 당신의 함수의 이름을 바꿔야합니다 이 효과에 오류 메시지가 표시되는 경우 변수
객체 코드를 컴파일하고 연결하여 동적으로로드토토 사이트 순위항상 특별해야합니다 깃발. 보다섹션 13.4.6특정 운영 체제.
사용하기 전에PostgreSQL확장 함수 c 순서대로 컴파일하고 특별한 방식으로 연결해야합니다. 서버에서 필요에 따라 동적으로로드 할 수 있습니다. 정확히 말하면, a공유 라이브러리필요 만들려면.
자세한 내용은 문서를 읽어야합니다 운영 체제, 특히 C의 수동 페이지 컴파일러,CC및 링크 편집기,ld. 또한PostgreSQL소스 코드에는 여러 가지가 포함되어 있습니다 의 작업 예제Contrib디렉토리. 이 예에 의존하면 의 가용성에 따라 모듈PostgreSQL소스 코드.
공유 라이브러리 생성은 일반적으로 링크와 유사합니다 실행 파일 : 먼저 소스 파일이 객체로 컴파일됩니다 파일, 객체 파일이 함께 연결됩니다. 대상 파일은로 만들어야합니다.위치 독립 코드(PIC)는 개념적으로 그들이 할 수 있음을 의미합니다 메모리의 임의의 위치에 배치 될 때 실행 파일로로드. (객체 파일 실행 파일은 그런 식으로 컴파일되지 않습니다.) 공유 라이브러리에는 특수 플래그가 포함되어 있습니다 실행 파일 연결. --- 적어도 이것은 이론입니다. 일부 시스템은 연습이 훨씬 추악합니다.
다음 예에서는 소스 코드가 파일에서foo.c그리고 우리는 an을 만들 것입니다 공유 도서관foo.so. 그만큼 중간 객체 파일은입니다.foo.o42720_42836
생성 할 컴파일러 플래그PICis-fpic. 공유 라이브러리 생성 링커 플래그는입니다.-shared.
gcc -fpic -c foo.c ld -shared -o foo.so foo.o버전 4.0에서 적용 가능BSD/OS.
생성 할 컴파일러 플래그PICis-fpic. 에게 공유 라이브러리 생성 컴파일러 플래그는-shared.
gcc -fpic -c foo.c gcc -shared -o foo.so foo.o버전 3.0에서 적용 가능freebsd.
생성 할 시스템 컴파일러의 컴파일러 플래그PICis+z. 사용시GCCit '-fpic. 공유 라이브러리의 링커 플래그 이다-B. 그래서
CC +Z -C foo.c또는
gcc -fpic -c foo.cand
ld -b -o foo.sl foo.ohp-ux확장 사용.SL공유 라이브러리의 경우 대부분과 달리 기타 시스템.
PIC기본값입니다 특수 컴파일러 옵션이 필요합니다. 링커 옵션 공유 라이브러리를 생산하려면-shared.
CC -C foo.c ld -shared -o foo.so foo.o
생성 할 컴파일러 플래그PICis-fpic. ~에 어떤 상황에서는 일부 플랫폼-fpicif 사용해야합니다.-fpic작동하지 않습니다. GCC를 참조하십시오 자세한 내용은 설명서. 컴파일러 플래그를 작성합니다 공유 도서관은-shared. 에이 완전한 예는 다음과 같이 보입니다.
cc -fpic -c foo.c cc -shared -o foo.so foo.o
생성 할 컴파일러 플래그PICis-fpic. 을 위한ELF시스템, 플래그를 가진 컴파일러-sharedIS 공유 라이브러리를 연결하는 데 사용됩니다. 더 오래된 비 엘프 시스템,ld -BsharableIS 사용된.
gcc -fpic -c foo.c gcc -shared -o foo.so foo.o
생성 할 컴파일러 플래그PICis-fpic. ld -Bsharable링크에 사용됩니다 공유 도서관.
gcc -fpic -c foo.c ld -bsharable -o foo.so foo.o
PIC기본값입니다 컴파일 명령은 일반적인 명령입니다.ld특수 옵션이있는 경우 사용됩니다 링크 :
CC -C FOO.C ld -shared -expect_unresolved '*'-o foo.so foo.o동일한 절차가 시스템 대신 GCC와 함께 사용됩니다. 컴파일러; 특별한 옵션이 필요하지 않습니다.
생성 할 컴파일러 플래그PICis-kpic썬 컴파일러와-fpicwithGCC. 공유 링크 라이브러리, 컴파일러 옵션은입니다.-g컴파일러 또는 대안으로-샤드withGCC.
CC -KPIC -C FOO.C cc -g -o foo.so foo.o또는
gcc -fpic -c foo.c gcc -g -o foo.so foo.o
생성 할 컴파일러 플래그PICis-K PICSCO 컴파일러와-fpicwithGCC. 공유 링크 라이브러리, 컴파일러 옵션은입니다.-gSCO 컴파일러와-sharedwithGCC.
CC -K PIC -C FOO.C cc -g -o foo.so foo.o또는
gcc -fpic -c foo.c gcc -shared -o foo.so foo.o
팁 :확장자를 포장하려는 경우 사용을 고려해야 할 광범위한 분포 모듈gnu libtool공유 도서관 건물. 플랫폼을 캡슐화합니다 일반적이고 강력한 인터페이스의 차이점. 심각한 포장에는 라이브러리에 대한 고려가 필요합니다 버전화, 기호 해상도 메소드 및 기타 문제.
결과 공유 라이브러리 파일을로드 할 수 있습니다토토 사이트 순위. 지정할 때 파일 이름기능 생성명령, 공유 라이브러리 파일의 이름을 알려야합니다. (끝에서.so)가 아닌 간단한 객체 파일.
참고 :실제로,토토 사이트 순위당신이 이름을 신경 쓰지 않습니다 공유 라이브러리 파일 인 한 파일.