집 >운영 및 유지보수 >리눅스 운영 및 유지 관리 >Linux에서 라이브러리와 헤더 파일 간의 연결은 무엇입니까?
Linux의 라이브러리와 헤더 파일 간의 연결: 헤더 파일에는 함수 선언이 있고 라이브러리 파일에 구현된 함수 정의는 헤더 파일에서 선언되어야 합니다. 프로그램을 작성할 때 헤더 파일을 사용하여 상수 정의와 시스템 함수 및 라이브러리 함수에 대한 호출 선언을 제공해야 하며 라이브러리는 컴파일된 함수의 모음, 즉 대상 파일 ".o"의 모음입니다. 재사용성의 원칙에 따라 작성되었으며 일반적으로 공통 작업을 수행하기 위한 일련의 상호 연관된 기능으로 구성됩니다.
이 튜토리얼의 운영 환경: linux7.3 시스템, Dell G3 컴퓨터.
일반적인 애플리케이션 소스 코드에는 헤더 파일에 함수 선언이 있고 라이브러리 파일은 함수 정의를 구현합니다. 라이브러리의 각 함수는 헤더 파일에 선언되어야 합니다.
프로그램을 작성할 때 시스템 함수 및 라이브러리 함수 호출에 대한 정의와 선언을 제공하기 위해 헤더 파일을 사용해야 합니다. 를 포함합니다. 이러한 헤더 파일은 X 윈도우 시스템의 /usr/include/X11 및 GNU C++의 /usr/include/c++와 같이 컴파일러에서 자동으로 검색할 수 있는 디렉터리에 있습니다. /usr/include
中。这些头文件都位于可以被编译器自动搜索到的目录中,如X视窗系统的/usr/include/X11和GNU C++的/usr/include /c++。
在调用gcc时,可以使用标志-I
来包含保存在子目录或其它非标准位置中的头文件,例如 gcc -I/usr/openwin/include fred.c
库是一组已经编译好的函数的集合,也就是目标文件.o的集合,是按照可重用的原则编写的,一般由一组互关联的函数组成以执行某项常见任务。
标准linux系统库文件一般存储在/lib
和/usr/lib
目录中。默认情况下GCC的链接程序只搜索标准C语言库,这是一个历史遗留问题。我们必须使库文件名遵守特定的规范并在命令行中加以指定。
库文件总以lib开头,然后指出这是什么库,最后的部分.a代表静态函数库,.so代表共享函数库(即windows下的DLL动态链接库)。
如gcc -o fred fred.c /usr/lib/libm.a
或gcc -o fred fred.c -lm
-L
标志为链接器增加库的搜索路径,如gcc -o x11fred -L /usr/openwin/lib x11fred.c -1X11
静态库以.a结尾,也称作归档文件,在生成可执行程序时,静态库文件就被链接进去,生成的可执行文件较大,可以脱离静态库文件运行。
首先创建两个源文件fred.c和bill.c
然后用gcc -c
编译生成两个目标文件
然后为这两个函数编写头文件,进行函数声明
然后在main函数中包含头文件并调用其中一个库函数
然后编译main函数并将main.o和之前生成的bill.o链接,可以正确执行
接下来我们生成库文件,用ar归档程序创建归档文件并将目标文件添加进去,它可将若干单独的文件归并到一个大的文件中。ar crv libfoo.a bill.o fred.o
之后我们要用ranlib
命令为函数库生成一个内容表。
然后我们将库文件和之前生成的program.o文件链接起来,执行成功
也可以用-l
指定函数库,并用-L
指定非标准位置。
我们可以用nm
gcc를 호출할 때 -I
플래그를 사용하여 하위 디렉터리나 기타 비표준 위치에 저장된 헤더 파일을 포함할 수 있습니다(예: gcc -I/usr/openwin/include fred). c
/lib
및 /usr/lib
디렉터리에 저장됩니다. 기본적으로 GCC 링커는 표준 C 언어 라이브러리만 검색하는데 이는 역사적 문제입니다. 라이브러리 파일 이름을 특정 규칙에 맞춰 명령줄에 지정해야 합니다. 🎜🎜🎜라이브러리 파일은 항상 lib로 시작하고, 마지막 부분인 .a는 정적 함수 라이브러리를 나타내고 .so는 공유 함수 라이브러리(즉, Windows의 DLL 동적 링크 라이브러리)를 나타냅니다. 🎜🎜🎜예: gcc -o fred fred.c /usr/lib/libm.a
또는 gcc -o fred fred.c -lm
-L
플래그는 gcc -o x11fred -L /usr/openwin/lib x11fred.c -1X11
🎜gcc -c
를 사용하여 두 개를 컴파일하고 생성합니다. 대상 파일🎜🎜🎜 🎜그런 다음 이 두 함수에 대한 헤더 파일을 작성하고 함수 선언을 만듭니다🎜🎜🎜🎜그런 다음 메인 함수에 헤더 파일을 포함시키고 라이브러리 함수 중 하나를 호출하세요🎜🎜🎜🎜그런 다음 main 함수를 컴파일하고 main.o를 이전에 생성된 bill.o와 연결하면 올바르게 실행될 수 있습니다. 🎜🎜🎜🎜다음 라이브러리 파일을 생성하고 ar archiver를 사용하여 아카이브 파일을 생성하고 여기에 대상 파일을 추가하면 여러 개별 파일을 하나의 큰 파일로 병합할 수 있습니다. ar crv libfoo.a bill.o fred.o
그런 다음 ranlib
명령을 사용하여 함수 라이브러리에 대한 콘텐츠 테이블을 생성해야 합니다. 🎜🎜🎜🎜그러면 앞서 생성한 program.o 파일과 라이브러리 파일을 연결했더니 실행이 성공했습니다🎜🎜🎜🎜 -l
을 사용하여 함수 라이브러리를 지정하고 -L
을 사용하여 비-함수 라이브러리를 지정할 수도 있습니다. 표준 위치. 🎜🎜🎜🎜🎜 nm
명령을 사용하면 디스어셈블리 분석에 사용할 수 있는 대상 파일, 함수 라이브러리 또는 실행 파일에 어떤 함수가 포함되어 있는지 확인할 수 있습니다. 프로그램이 생성되면 함수 라이브러리에는 실제로 필요한 함수만 포함됩니다. 헤더 파일에 모든 함수에 대한 선언이 있지만 링커는 이를 모두 연결하지는 않습니다. 🎜
Linux와 Windows의 정적 라이브러리 비교
많은 응용 프로그램이 동시에 실행되고 모두 동일한 함수 라이브러리의 함수를 사용할 때 메모리 동일한 기능의 복사본이 많아 메모리와 외부 저장소가 낭비됩니다! ! 프로그램이 함수 라이브러리를 사용하면 링크할 때 더 이상 함수 코드가 포함되지 않지만, 컴파일된 프로그램이 실행을 위해 메모리에 로드되면 함수 참조가 구문 분석되고 한 쌍의 The 공유 라이브러리가 호출되고, 필요한 경우 공유 라이브러리가 메모리에 로드됩니다. 즉, 시스템은 많은 애플리케이션이 호출할 수 있도록 메모리에 공유 라이브러리의 복사본 하나만 보관할 수 있거나 외부 메모리에 복사본 하나만 보관할 수 있습니다. 더욱이, 공유 라이브러리는 이를 사용하는 애플리케이션과 독립적으로 업데이트될 수 있으며 애플리케이션을 다시 컴파일할 필요가 없습니다.
Linux 시스템에서 클라이언트 프로그램이 참조하는 공유 라이브러리 및 구문 분석 기능을 로드하는 프로그램(동적 로더)은 ld.so
중간 파일 bill.o 사용 fred.o는 공유 라이브러리 libfoo.so gcc -shared -fpic -o libfoo.so bill.o fred.o
gcc -shared -fpic -o libfoo.so bill.o fred.o
生成了共享库后,要置于标准搜索目录下。搜索共享库的额外位置可以在文件/etc/ld.so.conf
中配置,修改这个文件后执行命令ldconfig
来处理。/etc/ld.so.conf
的内容为include /etc/ld.so.conf.d/*.conf
,在此目录下建立自己的动态链接库路径配置文件mylib.conf
然后指定搜索路径
链接生成可执行文件gcc -o main program.o -lfoo -L.
ldd工具可用来分析可执行文件运行所需要的共享库
也可以在编译目标代码时指定.so库的搜索路径,通过gcc 的参数-Wl,-rpath
指定,如gcc main.cpp -lfoo -L. -Wl,-rpath=.
/etc/ld.so.conf
파일에서 구성할 수 있습니다. 이 파일을 수정한 후 ldconfig
명령을 실행하여 처리합니다. /etc/ld.so.conf
의 내용은 include /etc/ld.so.conf.d/*.conf
입니다. 이 디렉토리에 자신만의 역학을 생성하세요. 링크 라이브러리 경로 구성 파일 mylib.conf
gcc -o main program.o -lfoo -L.
🎜🎜🎜🎜🎜ldd🎜 도구를 사용할 수 있습니다. 실행 파일 분석 파일 작업에 필요한 공유 라이브러리🎜🎜🎜🎜대상 코드를 컴파일할 때 .so 라이브러리의 검색 경로를 지정할 수도 있습니다. gcc와 같은 gcc 매개변수 <code>-Wl,-rpath
를 통해 지정하세요. main.cpp -lfoo - L. -Wl,-rpath=.-Wl은 다음 매개변수가 링크 프로그램 ld에 전달됨을 의미합니다(gcc가 여러 동적 라이브러리 검색을 지정할 때 자동으로 ld를 호출하기 때문). 경로 사이에 콜론을 사용하세요. 🎜🎜🎜🎜🎜관련 추천: "🎜Linux 비디오 튜토리얼🎜"🎜위 내용은 Linux에서 라이브러리와 헤더 파일 간의 연결은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!