>운영 및 유지보수 >리눅스 운영 및 유지 관리 >Linux에서 라이브러리와 헤더 파일 간의 연결은 무엇입니까?

Linux에서 라이브러리와 헤더 파일 간의 연결은 무엇입니까?

青灯夜游
青灯夜游원래의
2023-03-16 10:27:121445검색

Linux의 라이브러리와 헤더 파일 간의 연결: 헤더 파일에는 함수 선언이 있고 라이브러리 파일에 구현된 함수 정의는 헤더 파일에서 선언되어야 합니다. 프로그램을 작성할 때 헤더 파일을 사용하여 상수 정의와 시스템 함수 및 라이브러리 함수에 대한 호출 선언을 제공해야 하며 라이브러리는 컴파일된 함수의 모음, 즉 대상 파일 ".o"의 모음입니다. 재사용성의 원칙에 따라 작성되었으며 일반적으로 공통 작업을 수행하기 위한 일련의 상호 연관된 기능으로 구성됩니다.

Linux에서 라이브러리와 헤더 파일 간의 연결은 무엇입니까?

이 튜토리얼의 운영 환경: linux7.3 시스템, Dell G3 컴퓨터.

일반적인 애플리케이션 소스 코드에는 헤더 파일에 함수 선언이 있고 라이브러리 파일은 함수 정의를 구현합니다. 라이브러리의 각 함수는 헤더 파일에 선언되어야 합니다.

1. 헤더 파일

프로그램을 작성할 때 시스템 함수 및 라이브러리 함수 호출에 대한 정의와 선언을 제공하기 위해 헤더 파일을 사용해야 합니다. 를 포함합니다. 이러한 헤더 파일은 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

2. 库文件

库是一组已经编译好的函数的集合,也就是目标文件.o的集合,是按照可重用的原则编写的,一般由一组互关联的函数组成以执行某项常见任务。

标准linux系统库文件一般存储在/lib/usr/lib目录中。默认情况下GCC的链接程序只搜索标准C语言库,这是一个历史遗留问题。我们必须使库文件名遵守特定的规范并在命令行中加以指定。

库文件总以lib开头,然后指出这是什么库,最后的部分.a代表静态函数库,.so代表共享函数库(即windows下的DLL动态链接库)。

gcc -o fred fred.c /usr/lib/libm.agcc -o fred fred.c -lm
-L标志为链接器增加库的搜索路径,如gcc -o x11fred -L /usr/openwin/lib x11fred.c -1X11

2.1 静态库

静态库以.a结尾,也称作归档文件,在生成可执行程序时,静态库文件就被链接进去,生成的可执行文件较大,可以脱离静态库文件运行。

2.1.1 生成方法

首先创建两个源文件fred.c和bill.c

Linux에서 라이브러리와 헤더 파일 간의 연결은 무엇입니까?

Linux에서 라이브러리와 헤더 파일 간의 연결은 무엇입니까?

然后用gcc -c编译生成两个目标文件

Linux에서 라이브러리와 헤더 파일 간의 연결은 무엇입니까?

然后为这两个函数编写头文件,进行函数声明

Linux에서 라이브러리와 헤더 파일 간의 연결은 무엇입니까?

然后在main函数中包含头文件并调用其中一个库函数

Linux에서 라이브러리와 헤더 파일 간의 연결은 무엇입니까?

然后编译main函数并将main.o和之前生成的bill.o链接,可以正确执行

Linux에서 라이브러리와 헤더 파일 간의 연결은 무엇입니까?

接下来我们生成库文件,用ar归档程序创建归档文件并将目标文件添加进去,它可将若干单独的文件归并到一个大的文件中。ar crv libfoo.a bill.o fred.o 之后我们要用ranlib命令为函数库生成一个内容表。

Linux에서 라이브러리와 헤더 파일 간의 연결은 무엇입니까?

然后我们将库文件和之前生成的program.o文件链接起来,执行成功

Linux에서 라이브러리와 헤더 파일 간의 연결은 무엇입니까?

也可以用-l指定函数库,并用-L指定非标准位置。

Linux에서 라이브러리와 헤더 파일 간의 연결은 무엇입니까?

我们可以用nmgcc를 호출할 때 -I 플래그를 사용하여 하위 디렉터리나 기타 비표준 위치에 저장된 헤더 파일을 포함할 수 있습니다(예: gcc -I/usr/openwin/include fred). c

🎜🎜🎜2. 라이브러리 파일 🎜🎜🎜라이브러리는 컴파일된 함수의 집합, 즉 재사용 가능한 대상 파일의 집합입니다.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🎜

🎜🎜2.1 정적 라이브러리🎜

🎜정적 라이브러리는 .a로 끝납니다. 아카이브 파일이라고도 합니다. 실행 가능한 프로그램을 생성할 때 정적 라이브러리 파일이 링크되어 생성된 실행 파일의 크기가 더 커집니다. . 정적 라이브러리 파일 없이 실행될 수 있습니다. 🎜

🎜🎜2.1.1 생성 방법🎜

🎜먼저 fred.c와 bill.c라는 두 개의 소스 파일을 만듭니다🎜🎜Linux에서 라이브러리와 헤더 파일 간의 연결은 무엇입니까?🎜🎜Linux에서 라이브러리와 헤더 파일 간의 연결은 무엇입니까?🎜🎜그런 다음 gcc -c를 사용하여 두 개를 컴파일하고 생성합니다. 대상 파일🎜🎜Linux에서 라이브러리와 헤더 파일 간의 연결은 무엇입니까?🎜 🎜그런 다음 이 두 함수에 대한 헤더 파일을 작성하고 함수 선언을 만듭니다🎜🎜Linux에서 라이브러리와 헤더 파일 간의 연결은 무엇입니까?🎜🎜그런 다음 메인 함수에 헤더 파일을 포함시키고 라이브러리 함수 중 하나를 호출하세요🎜🎜Linux에서 라이브러리와 헤더 파일 간의 연결은 무엇입니까?🎜🎜그런 다음 main 함수를 컴파일하고 main.o를 이전에 생성된 bill.o와 연결하면 올바르게 실행될 수 있습니다. 🎜🎜🎜🎜다음 라이브러리 파일을 생성하고 ar archiver를 사용하여 아카이브 파일을 생성하고 여기에 대상 파일을 추가하면 여러 개별 파일을 하나의 큰 파일로 병합할 수 있습니다. ar crv libfoo.a bill.o fred.o 그런 다음 ranlib 명령을 사용하여 함수 라이브러리에 대한 콘텐츠 테이블을 생성해야 합니다. 🎜🎜Linux에서 라이브러리와 헤더 파일 간의 연결은 무엇입니까?🎜🎜그러면 앞서 생성한 program.o 파일과 라이브러리 파일을 연결했더니 실행이 성공했습니다🎜🎜Linux에서 라이브러리와 헤더 파일 간의 연결은 무엇입니까?🎜🎜 -l을 사용하여 함수 라이브러리를 지정하고 -L을 사용하여 비-함수 라이브러리를 지정할 수도 있습니다. 표준 위치. 🎜🎜Linux에서 라이브러리와 헤더 파일 간의 연결은 무엇입니까?🎜🎜🎜 nm 명령을 사용하면 디스어셈블리 분석에 사용할 수 있는 대상 파일, 함수 라이브러리 또는 실행 파일에 어떤 함수가 포함되어 있는지 확인할 수 있습니다. 프로그램이 생성되면 함수 라이브러리에는 실제로 필요한 함수만 포함됩니다. 헤더 파일에 모든 함수에 대한 선언이 있지만 링커는 이를 모두 연결하지는 않습니다. 🎜

Linux에서 라이브러리와 헤더 파일 간의 연결은 무엇입니까?

1Linux에서 라이브러리와 헤더 파일 간의 연결은 무엇입니까?

Linux와 Windows의 정적 라이브러리 비교

1Linux에서 라이브러리와 헤더 파일 간의 연결은 무엇입니까?

2.2 공유 라이브러리

많은 응용 프로그램이 동시에 실행되고 모두 동일한 함수 라이브러리의 함수를 사용할 때 메모리 동일한 기능의 복사본이 많아 메모리와 외부 저장소가 낭비됩니다! ! 프로그램이 함수 라이브러리를 사용하면 링크할 때 더 이상 함수 코드가 포함되지 않지만, 컴파일된 프로그램이 실행을 위해 메모리에 로드되면 함수 참조가 구문 분석되고 한 쌍의 The 공유 라이브러리가 호출되고, 필요한 경우 공유 라이브러리가 메모리에 로드됩니다. 즉, 시스템은 많은 애플리케이션이 호출할 수 있도록 메모리에 공유 라이브러리의 복사본 하나만 보관할 수 있거나 외부 메모리에 복사본 하나만 보관할 수 있습니다. 더욱이, 공유 라이브러리는 이를 사용하는 애플리케이션과 독립적으로 업데이트될 수 있으며 애플리케이션을 다시 컴파일할 필요가 없습니다.
Linux 시스템에서 클라이언트 프로그램이 참조하는 공유 라이브러리 및 구문 분석 기능을 로드하는 프로그램(동적 로더)은 ld.so

2.2.1 생성 방법

중간 파일 bill.o 사용 fred.o는 공유 라이브러리 libfoo.so gcc -shared -fpic -o libfoo.so bill.o fred.ogcc -shared -fpic -o libfoo.so bill.o fred.o

1Linux에서 라이브러리와 헤더 파일 간의 연결은 무엇입니까?

生成了共享库后,要置于标准搜索目录下。搜索共享库的额外位置可以在文件/etc/ld.so.conf中配置,修改这个文件后执行命令ldconfig来处理。
/etc/ld.so.conf的内容为include /etc/ld.so.conf.d/*.conf,在此目录下建立自己的动态链接库路径配置文件mylib.conf

1Linux에서 라이브러리와 헤더 파일 간의 연결은 무엇입니까?

然后指定搜索路径

1Linux에서 라이브러리와 헤더 파일 간의 연결은 무엇입니까?

链接生成可执行文件gcc -o main program.o -lfoo -L.

1Linux에서 라이브러리와 헤더 파일 간의 연결은 무엇입니까?

ldd工具可用来分析可执行文件运行所需要的共享库

1Linux에서 라이브러리와 헤더 파일 간의 연결은 무엇입니까?

也可以在编译目标代码时指定.so库的搜索路径,通过gcc 的参数-Wl,-rpath指定,如gcc main.cpp -lfoo -L. -Wl,-rpath=.

1Linux에서 라이브러리와 헤더 파일 간의 연결은 무엇입니까?1Linux에서 라이브러리와 헤더 파일 간의 연결은 무엇입니까?

공유 라이브러리가 생성된 후에는 표준 검색 디렉터리에 배치해야 합니다. 공유 라이브러리를 검색하기 위한 추가 위치는 /etc/ld.so.conf 파일에서 구성할 수 있습니다. 이 파일을 수정한 후 ldconfig 명령을 실행하여 처리합니다.

/etc/ld.so.conf의 내용은 include /etc/ld.so.conf.d/*.conf입니다. 이 디렉토리에 자신만의 역학을 생성하세요. 링크 라이브러리 경로 구성 파일 mylib.conf

1Linux에서 라이브러리와 헤더 파일 간의 연결은 무엇입니까?🎜🎜그런 다음 검색 경로를 지정하세요🎜🎜1Linux에서 라이브러리와 헤더 파일 간의 연결은 무엇입니까?🎜🎜실행 파일 생성 링크gcc -o main program.o -lfoo -L.🎜🎜1Linux에서 라이브러리와 헤더 파일 간의 연결은 무엇입니까?🎜🎜🎜ldd🎜 도구를 사용할 수 있습니다. 실행 파일 분석 파일 작업에 필요한 공유 라이브러리🎜🎜17 .png🎜🎜대상 코드를 컴파일할 때 .so 라이브러리의 검색 경로를 지정할 수도 있습니다. gcc와 같은 gcc 매개변수 <code>-Wl,-rpath를 통해 지정하세요. main.cpp -lfoo - L. -Wl,-rpath=.-Wl은 다음 매개변수가 링크 프로그램 ld에 전달됨을 의미합니다(gcc가 여러 동적 라이브러리 검색을 지정할 때 자동으로 ld를 호출하기 때문). 경로 사이에 콜론을 사용하세요. 🎜🎜🎜🎜🎜관련 추천: "🎜Linux 비디오 튜토리얼🎜"🎜

위 내용은 Linux에서 라이브러리와 헤더 파일 간의 연결은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.