LINUX 시스템에서 동적 링크 라이브러리 작성 및 사용
/* datetime.h :*/
#ifndef __DATETIME_H
#define __DATETIME_H
/* */
typedef struct
{
int year;
int mon;
int day;
}DATETYPE;
/* */
typedef struct
{
char hour;
char min;
char sec;
} TIMETYPE;
/* */
#ifdef SHARED
int (*getdate)(DATETYPE *d);
#else
int getdate(DATETYPE *d);
#endif
#ifdef SHARED
int (*gettime)(TIMETYPE *t);
#else
int gettime(TIMETYPE *t);
#endif
#endif
이 사용자 인터페이스 파일에서 먼저 날짜와 시간 구조를 정의한 다음에 함수의 원형을 정의합니다.동적 함수는 정적 함수의 원형 설명과 달리 동적 함수는 지침을 인용하기 위해 (*함수명)의 형식을 사용해야 한다.파일의 동적 함수 설명을 참조하려면 SHARED 매크로를 정의해야 사용할 수 있습니다.1.2 getdate를 작성합니다.c. 소스 프로그램은 다음과 같습니다.
/* getdate.c : */
#include "time.h"
#include "datetime.h"
int getdate(DATETYPE *d)
{
long ti;
struct tm *tm;
time(&ti);
tm=localtime(&ti);
d->year=tm->tm_year+1900;
d->mon=tm->tm_mon+1;
d->day=tm->tm_mday;
}
getdate 함수에서 먼저 타임을 호출하여 초로 계산된 시스템 시간을 얻고localtime 함수로 시간 구조를 변환한 다음 정확한 날짜를 조정합니다.1.3 gettime을 작성합니다.c. 소스 프로그램은 다음과 같습니다.
/* gettime.c : */
#include "time.h"
#include "datetime.h"
int gettime(TIMETYPE *t)
{
long ti;
struct tm *tm;
time(&ti);
tm=localtime(&ti);
t->hour=tm->tm_hour;
t->min=tm->tm_min;
t->sec=tm->tm_sec;
}
gettime 함수는 getdate 함수와 비슷합니다. 먼저 time 함수로 초계 시스템 시간을 얻은 다음에localtime 함수로 시간 구조를 변환하고, 마지막으로 현재 시간을 되돌려줍니다. (조정할 필요가 없습니다.)1.4 유지 보수 파일makefile-lib을 작성합니다. 내용은 다음과 같습니다.
# makefile-lib : .
all : my.so
SRC = getdate.c gettime.c
TGT = $(SRC:.c=.o)
$(SRC) : datetime.h
@touch $@
%.o : %.c
cc -c $?
# (my.so)
my.so : $(TGT)
cc -shared -o $@ $(TGT)
유지보수 파일을 작성하는 목적은 프로그래머의 유지보수 프로그램, 특히 비교적 큰 프로젝트 유지보수를 편리하게 하는 데 있다.소질이 좋은 프로그래머는 유지보수 파일makefile을 능숙하게 작성하는 것을 배워야 한다.파일 간의 의존 관계를 정의한 후 원본 파일에 변화가 발생하면make만 있으면 목표 파일 유지보수 코드가 자동으로 실행되고 목표 파일을 자동으로 업데이트하여 많은 작업량을 줄일 수 있다.주의: 줄마다 유지보수 코드는 TAB (점프 키) 로 시작해야 합니다. 그렇지 않으면 make에서 오류가 발생합니다.이 유지 보수 파일의 첫 번째 행은 # 번호로 시작하는 주석 행입니다.파일 세 번째 줄에서 유지보수가 필요한 함수 라이브러리를 정의합니다.다섯 번째 줄에서 관련 원본 프로그램 파일 정의하기;7행에서 대상 파일 정의하기;9-10줄은 모든 원본 프로그램이datetime에 의존한다는 것을 설명한다.h 헤더 파일과 상응하는 유지보수 코드, 즉 터치해서 원본 파일을 업데이트하는 시간;12-13 줄 정의.o 파일은 해당 파일에 의존합니다.c 파일, 그리고 유지보수 코드를 지정했습니다. 즉, cc로 컴파일합니다.16-17 줄 정의 공유 라이브러리 my.so 의존하는 목표 파일, 유지보수 코드에서 -shared 컴파일 옵션을 사용하여 동적 링크 라이브러리 my를 생성합니다.so. 1.5make-f makefile-lib 명령make가 실행되면 동적 링크 라이브러리 my.so가 생기면 우리는 프로그램에서 호출할 수 있다.시스템의 모든 사용자가 사용할 수 있도록 하려면 루트 사용자로 시스템에 로그인해서 이 라이브러리를/lib 디렉터리(명령:cp my.so/lib)로 복사하거나/lib 디렉터리에 기호 연결을 만들면 됩니다(명령:ln -s`pwd`/my.so/lib).2. LINUX 아래 동적 링크 라이브러리의 사용 2.1 중요한dlfcn.h헤드 파일LINUX에서 동적 링크 라이브러리를 사용하려면 원본 프로그램에dlfcn.h헤드 파일, 이 파일은 동적 링크 라이브러리를 호출하는 함수의 원형을 정의합니다.다음은 이 함수들을 상세하게 설명한다.2.1.1 dlerror 원형은:const char*dlerror(void);동적 링크 라이브러리 작업 함수 실행이 실패했을 때, dlerror는 오류 정보를 되돌려주고, 값이 NULL일 때 작업 함수 실행이 성공했음을 나타냅니다.2.1.2 dlopen의 원형은:void*dlopen(const char*filename, int flag)이다.dlopen은 지정한 이름 (filename) 의 동적 링크 라이브러리를 열고 조작 핸들을 되돌려줍니다.파일name: 이름이/로 시작하지 않으면 절대 경로 이름이 아닙니다. 다음 순서대로 파일을 찾을 것입니다.(1) 사용자 환경 변수의 LDLIBRARY 값,(2) 동적 링크 버퍼 파일/etc/ld.so.cache(3) 디렉터리/lib,/usr/lib flag은 정의되지 않은 기호를 언제 해결할지 표시합니다.두 가지 수치: 1) RTLDLAZY: 동적 링크 라이브러리의 함수 코드가 실행될 때 해결되었음을 나타냅니다.2) RTLD_NOW: dlopen이 되돌아오기 전에 정의되지 않은 기호를 모두 해결합니다. 해결되지 않으면 dlopen은 오류를 되돌려줍니다.dlopen 호출이 실패했을 때, NULL 값을 되돌려줍니다. 그렇지 않으면 조작 핸들을 되돌려줍니다.2.1.3 dlsym: 함수 실행 주소의 원형은:void*dlsym(void*handle,char*symbol)이다.dlsym는 동적 링크 라이브러리 조작 핸들(handle)과 기호(symbol)에 따라 기호에 대응하는 함수의 실행 코드 주소를 되돌려줍니다.이 주소는 매개 변수를 가지고 상응하는 함수를 집행할 수 있다.예를 들어 프로그램 코드:void(*add)(int x, int y),/*호출할 동적 함수add*/add=dlsym("xxx.so", "add");/*xxx를 엽니다.so 공유 라이브러리,dd 함수 주소 */dd(89369);/*두 개의 매개 변수를 가지고 89와 369에서dd함수*/2.1.4 dlclose를 호출합니다: 동적 링크 라이브러리를 닫는 원형은 int dlclose(void*handle)입니다.dlclose는 지정한 핸들을 닫는 동적 링크 라이브러리입니다. 이 동적 링크 라이브러리의 사용 계수가 0일 때만 시스템에서 마운트 해제됩니다.2.2 프로그램에서 동적 링크 라이브러리 함수 2.2.1 프로그램 범례 아래의 프로그램이 동적 링크 라이브러리 my를 불러왔다.so, getdate, gettime로 현재 날짜와 시간을 출력합니다.
#include "stdio.h" /* */
#include "dlfcn.h" /* */
#define SOFILE "./my.so" /* */
#define SHARED /* , , */
#include "datetime.h" /* */
main()
{
DATETYPE d;
TIMETYPE t;
void *dp;
char *error;
puts(" ");
dp=dlopen(SOFILE,RTLD_LAZY); /* */
if (dp==NULL) /* */
{
fputs(dlerror(),stderr);
exit(1);
}
getdate=dlsym(dp,"getdate"); /* */
error=dlerror(); /* */
if (error) /* */
{
fputs(error,stderr);
exit(1);
}
getdate(&d); /* */
printf(" : %04d-%02d-%02d
",d.year,d.mon,d.day);
gettime=dlsym(dp,"gettime"); /* */
error=dlerror(); /* */
if (error) /* */
{
fputs(error,stderr);
exit(1);
}
gettime(&t); /* */
printf(" : %02d:%02d:%02d
",t.hour,t.min,t.sec);
dlclose(dp); /* */
exit(0); /* */
}
프로그램 설명: 8행: 표준 입력 출력 헤더 파일을 포함한다. 프로그램에서 printf,puts,fputs 등 표준 입력 출력 함수를 사용했기 때문에 컴파일러가 헤더 파일의 함수의 원형에 따라 문법을 검사해야 한다.10-11 줄: 동적 링크 라이브러리 기능 헤더 파일을 포함하고 동적 링크 라이브러리 이름을 정의한다.13-14 줄: 14 줄의 헤더 파일을 인용할 수 있도록 매크로 SHARED를 정의합니다.h의 동적 함수 설명;25행: dlopen으로 SOFILE 공유 라이브러리를 열고 핸들 dp로 되돌아오기;27-31줄: dp가 비어 있는지 검사하고 비어 있으면 오류를 표시하고 종료합니다.33행:dlsym로 getdate 함수 동적 주소 얻기;35-40줄: 만약dlerror 반환값이 비어 있지 않으면dlsym에서 오류가 발생하고 프로그램이 오류를 표시한 후에 종료합니다.42-43 줄: getdate 호출을 실행하고 현재 날짜를 출력합니다.45행:dlsym로 gettime 함수 동적 주소 얻기;47-52 줄:dlerror 반환 값이 비어 있지 않으면dlsym에서 오류가 발생하고 프로그램이 오류를 표시한 후에 종료합니다.54-55 줄: gettime 호출을 실행하고 현재 시간을 출력합니다.57줄:dlclose로 dp가 가리키는 동적 링크 라이브러리를 닫기;59 줄: 프로그램이 종료되고 0 값을 되돌려줍니다.2.2.2 유지 보수 파일makefile 작성 내용은 다음과 같습니다.
# makefile : , 2001-06-28.
all : dy
DYSRC = dy.c
DYTGT = $(DYSRC:.c=.o)
%.o : %.c
cc -c $?
#
dy : $(DYTGT)
cc -rdynamic -s -o $@ $(DYTGT) -ldl
유지보수 파일 설명: 3행: 유지보수가 필요한 모든 모듈을 정의합니다.다섯 번째 줄: 원본 프로그램 정의하기;7행: 대상 파일 정의하기;9-10 줄: 정의.o 파일 종속c 파일, 유지보수 코드는'cc-c 변동된 원본 파일 이름'이다.13-14 줄: 정의dy는 변수 DYTGT가 표시하는 값에 의존하고 유지보수 코드에서는 -rdynamic 옵션을 사용하여 출력 파일을 동적 링크로 지정하는 방식을 사용하며 옵션-s는 목표 파일의 기호표를 삭제하고 마지막 옵션인 -ldl은 조립 프로그램ld가dl 함수 라이브러리를 불러와야 한다고 지시한다.2.2.3 make 명령을 실행하면 실행 파일dy가 생성되고 실행 후 다음과 같은 정보가 발생합니다.
동적 링크 라이브러리 시범 현재 날짜: 2001-06-28 현재 시간: 10:06:21 삭제할 때 my.so 파일 시 다음과 같은 정보가 나타납니다: 동적 링크 라이브러리 응용 시범 my.so: cannot open shared object file: 파일이나 디렉터리에 3이 존재하지 않습니다. 작은 요약 LINUX는 동적 링크 라이브러리를 만들고 사용하는 것이 어렵지 않습니다.함수 원본 프로그램을 컴파일할 때 -shared 옵션을 선택하면 동적 링크 라이브러리를 만들 수 있습니다. 주의하십시오.접미사 이름은 공용 라이브러리 디렉터리 (예:/lib,/usr/lib 등) 아래에 놓고 다른 사용자가 공유할 수 있도록 사용자 인터페이스 파일을 작성하는 것이 좋습니다.동적 링크 라이브러리를 사용합니다. 원본 프로그램에dlfcn.h헤드 파일, 프로그램을 쓸 때 dlopen 등 함수의 정확한 호출을 주의하고, 컴파일할 때 -rdynamic 옵션과 -ldl 옵션을 사용하여 동적 링크 라이브러리의 실행 코드를 호출할 수 있습니다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.