2016-07-09 4 views
0

LVM 용 사용자 정의 잠금 라이브러리를 구현하려고합니다. lvm.conf에서 locking_type을 external (2)로 설정하고 필요한 기능을 구현하는 공유 라이브러리를 제공하는 것이 이론적으로는 간단하고 비교적 간단합니다.헤더에없는 공유 라이브러리/모듈 - 인수 구조체 구현

이 글에서는 LVM2의 소스 (특히 외부 잠금 메커니즘 구현)에 대해 알아 보았습니다.이 도구는 here입니다.

기본적으로, 무엇을 나는 다음과 같이 설명 헤더 기능을 구현하기 위해 수행되는 필요가 있다고 생각 :

static void (*_reset_fn) (void) = NULL; 
static void (*_end_fn) (void) = NULL; 
static int (*_lock_fn) (struct cmd_context * cmd, const char *resource, uint32_t flags) = NULL; 
static int (*_init_fn) (int type, struct dm_config_tree * cft, uint32_t *flags) = NULL; 
static int (*_lock_query_fn) (const char *resource, int *mode) = NULL; 

이제 모든이 시점까지 복숭아. 그러나 _lock_fn 정의를 보면 첫 번째 인수로 struct cmd_context에 대한 포인터가 필요합니다. 이 구조체는 LVM2 소스에서 쉽게 찾을 수 있지만 (상당히 복잡한 구조입니다!) API로 패키지에 노출 된 헤더 (예 : RHEL7의 lvm2-devel 패키지) 안에 있지 않습니다. 상상할 수 있듯이 구조체가 외부 라이브러리에 의해 사용되기로되어 있기 때문에 헤더에 있어야한다는 것이 중요합니다.

내가 잘못 생각한 것일까 아니면 단지 "버그"일까요? LVM2 개발자와상의해야합니까? 해당 구조체 및 내 프로젝트의 헤더 파일에 종속 된 다른 모든 형식을 복사/붙여 넣기 이외의 다른 해결 방법이 있습니까? 이 "임시 해결책"을 수행하면 GNU GPL 라이센스가 중단됩니다.

struct cmd_context; 

이 그 이름을 가진 struct이 있다는 C 컴파일러를 알려줍니다 :

+0

또한 '불투명 포인터 유형'등에 대한 질문을 참조하십시오. 여기에서 사용중인 것으로 보입니다. 호출 코드가 구조의 내부에 대해 알 필요가 없거나 구조의 인스턴스를 로컬 또는 전역 변수로 할당 할 필요가 없을 때 좋은 생각입니다. 포인터만으로 충분하면 불투명 한 유형이 좋습니다. –

답변

2

당신이 링크 된 소스 파일, 간접적으로이 라인을 가지고 config.h 헤더가 포함되어 있습니다. 컴파일러가 올바른 기계 코드를 생성하기 위해 알아야 할 모든 것입니다.

구조체의 멤버에 액세스하거나 직접 개체를 만드는 경우 컴파일러에서 구조체의 크기 나 멤버를 알지 못하기 때문에 오류가 발생합니다.

그러나 알려진 기능의 포인터를 알려주는 opaque data type으로 사용하는 경우에는 괜찮습니다. 이것은 순방향 선언이라고하며 C에서 캡슐화를 달성하는 주요 방법입니다 (checkstdio의 FILE 확인).