Heim  >  Artikel  >  Betrieb und Instandhaltung  >  Welche Verbindung besteht zwischen Bibliotheken und Header-Dateien unter Linux?

Welche Verbindung besteht zwischen Bibliotheken und Header-Dateien unter Linux?

青灯夜游
青灯夜游Original
2023-03-16 10:27:121387Durchsuche

Die Verbindung zwischen Bibliotheken und Header-Dateien in Linux: Es gibt Funktionsdeklarationen in Header-Dateien und Definitionen von Funktionen, die in Bibliotheksdateien implementiert sind. Jede Funktion in der Bibliothek muss in der Header-Datei deklariert werden. Beim Schreiben eines Programms müssen Sie Header-Dateien verwenden, um Definitionen von Konstanten und Deklarationen von Aufrufen von Systemfunktionen und Bibliotheksfunktionen bereitzustellen. Eine Bibliothek ist eine Sammlung kompilierter Funktionen, also eine Sammlung von Zieldateien „.o“. Es ist nach dem Prinzip der Wiederverwendbarkeit geschrieben und besteht im Allgemeinen aus einer Reihe miteinander verbundener Funktionen zur Ausführung einer gemeinsamen Aufgabe.

Welche Verbindung besteht zwischen Bibliotheken und Header-Dateien unter Linux?

Die Betriebsumgebung dieses Tutorials: Linux7.3-System, Dell G3-Computer.

Im allgemeinen Anwendungsquellcode gibt es Funktionsdeklarationen in der Header-Datei, und Bibliotheksdateien implementieren die Definition der Funktion. Jede Funktion in der Bibliothek muss in der Header-Datei deklariert werden.

1. Header-Dateien

Beim Schreiben eines Programms müssen wir Header-Dateien verwenden, um Definitionen von Konstanten und Deklarationen von Systemfunktionen und Bibliotheksfunktionsaufrufen bereitzustellen. Diese Header-Dateien befinden sich in /usr/. einschließen. Diese Header-Dateien befinden sich in Verzeichnissen, die vom Compiler automatisch durchsucht werden können, z. B. /usr/include/X11 des X-Window-Systems und /usr/include/c++ von GNU 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

Welche Verbindung besteht zwischen Bibliotheken und Header-Dateien unter Linux?

Welche Verbindung besteht zwischen Bibliotheken und Header-Dateien unter Linux?

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

Welche Verbindung besteht zwischen Bibliotheken und Header-Dateien unter Linux?

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

Welche Verbindung besteht zwischen Bibliotheken und Header-Dateien unter Linux?

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

Welche Verbindung besteht zwischen Bibliotheken und Header-Dateien unter Linux?

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

Welche Verbindung besteht zwischen Bibliotheken und Header-Dateien unter Linux?

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

Welche Verbindung besteht zwischen Bibliotheken und Header-Dateien unter Linux?

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

Welche Verbindung besteht zwischen Bibliotheken und Header-Dateien unter Linux?

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

Welche Verbindung besteht zwischen Bibliotheken und Header-Dateien unter Linux?

我们可以用nmBeim Aufruf von gcc können Sie das Flag -I verwenden, um Header-Dateien einzuschließen, die in Unterverzeichnissen oder anderen nicht standardmäßigen Speicherorten gespeichert sind, wie z. B. gcc -I/usr/openwin/include fred. c

🎜🎜🎜2. Bibliotheksdatei 🎜🎜🎜Die Bibliothek ist eine Sammlung kompilierter Funktionen, also eine Sammlung von Zieldateien.o, die im Prinzip wiederverwendbar sind Es besteht im Allgemeinen aus einer Reihe miteinander verbundener Funktionen zur Ausführung einer gemeinsamen Aufgabe. 🎜🎜Standard-Linux-Systembibliotheksdateien werden im Allgemeinen in den Verzeichnissen /lib und /usr/lib gespeichert. Standardmäßig durchsucht der GCC-Linker nur die Standard-C-Sprachbibliothek, was ein historisches Problem darstellt. Wir müssen den Bibliotheksdateinamen an eine bestimmte Konvention anpassen und ihn in der Befehlszeile angeben. 🎜🎜🎜Bibliotheksdateien beginnen immer mit lib und geben dann an, um welche Bibliothek es sich handelt. Der letzte Teil .a repräsentiert die statische Funktionsbibliothek und .so repräsentiert die gemeinsam genutzte Funktionsbibliothek (dh die DLL-Dynamic-Link-Bibliothek unter Windows). 🎜🎜🎜So wie gcc -o fred fred.c /usr/lib/libm.a oder gcc -o fred fred.c -lm
Das Flag -L erhöht den Bibliothekssuchpfad für den Linker, z. B. gcc -o x11fred -L /usr/openwin/lib x11fred.c -1X11🎜

🎜🎜2.1 Statische Bibliothek🎜

🎜Statische Bibliothek endet mit .a, auch Archivdatei genannt. Beim Generieren eines ausführbaren Programms wird die statische Bibliotheksdatei eingebunden und die generierte ausführbare Datei ist größer . Kann ohne statische Bibliotheksdateien ausgeführt werden. 🎜

🎜🎜2.1.1 Generierungsmethode🎜

🎜Erstellen Sie zunächst zwei Quelldateien fred.c und bill.c🎜🎜Welche Verbindung besteht zwischen Bibliotheken und Header-Dateien unter Linux?🎜🎜Welche Verbindung besteht zwischen Bibliotheken und Header-Dateien unter Linux?🎜🎜Dann verwenden Sie gcc -c, um zwei zu kompilieren und zu generieren Zieldatei🎜🎜Welche Verbindung besteht zwischen Bibliotheken und Header-Dateien unter Linux?🎜 🎜Schreiben Sie dann Header-Dateien für diese beiden Funktionen und erstellen Sie Funktionsdeklarationen🎜🎜Welche Verbindung besteht zwischen Bibliotheken und Header-Dateien unter Linux?🎜🎜Dann fügen Sie die Header-Datei in die Hauptfunktion ein und rufen eine der Bibliotheksfunktionen auf🎜🎜Welche Verbindung besteht zwischen Bibliotheken und Header-Dateien unter Linux?🎜🎜Kompilieren Sie dann die Hauptfunktion und verknüpfen Sie main.o mit dem zuvor generierten bill.o, das korrekt ausgeführt werden kann 🎜🎜🎜🎜Nächster Wir generieren eine Bibliotheksdatei, erstellen mit dem AR-Archiver eine Archivdatei und fügen die Zieldatei hinzu. Dadurch können mehrere einzelne Dateien zu einer großen Datei zusammengeführt werden. ar crv libfoo.a bill.o fred.o Dann müssen wir den Befehl ranlib verwenden, um eine Inhaltstabelle für die Funktionsbibliothek zu generieren. 🎜🎜Welche Verbindung besteht zwischen Bibliotheken und Header-Dateien unter Linux?🎜🎜Dann Wir haben die Bibliotheksdatei mit der zuvor generierten program.o-Datei verknüpft und die Ausführung war erfolgreich🎜🎜Welche Verbindung besteht zwischen Bibliotheken und Header-Dateien unter Linux?🎜🎜Sie können auch -l verwenden, um die Funktionsbibliothek anzugeben, und -L, um die Nicht-Funktionsbibliothek anzugeben. Standardstandort. 🎜🎜Welche Verbindung besteht zwischen Bibliotheken und Header-Dateien unter Linux?🎜🎜🎜 Mit dem Befehl nm können wir prüfen, welche Funktionen in der Zieldatei, Funktionsbibliothek oder ausführbaren Datei enthalten sind, die für die Disassemblierungsanalyse verwendet werden können. Wenn ein Programm erstellt wird, enthält es in der Funktionsbibliothek nur die Funktionen, die es tatsächlich benötigt. Obwohl in der Header-Datei Deklarationen aller Funktionen vorhanden sind, werden sie vom Linker nicht alle verknüpft. 🎜

Welche Verbindung besteht zwischen Bibliotheken und Header-Dateien unter Linux?

1Welche Verbindung besteht zwischen Bibliotheken und Header-Dateien unter Linux?

Statischer Bibliotheksvergleich zwischen Linux und Windows

1Welche Verbindung besteht zwischen Bibliotheken und Header-Dateien unter Linux?

2.2 Gemeinsame Bibliothek

Wenn viele Anwendungen gleichzeitig ausgeführt werden und alle Funktionen aus derselben Funktionsbibliothek verwenden, Der Speicher Es wird viele Kopien derselben Funktion geben, was eine Verschwendung von Speicher und externem Speicher darstellt! ! Wenn ein Programm eine Funktionsbibliothek verwendet, enthält es beim Verknüpfen keinen Funktionscode mehr, sondern verweist auf gemeinsam genutzten Code, auf den zur Laufzeit zugegriffen werden kann. Wenn das kompilierte Programm zur Ausführung in den Speicher geladen wird, wird die Funktionsreferenz analysiert und ein Paar von The Die gemeinsam genutzte Bibliothek wird aufgerufen und bei Bedarf wird die gemeinsam genutzte Bibliothek in den Speicher geladen. Das heißt, das System kann nur eine Kopie der gemeinsam genutzten Bibliothek im Speicher behalten, damit viele Anwendungen sie aufrufen können, oder es kann nur eine Kopie im externen Speicher behalten. Darüber hinaus können gemeinsam genutzte Bibliotheken unabhängig von den Anwendungen aktualisiert werden, die auf ihnen basieren, und die Anwendungen müssen nicht neu kompiliert werden.
In Linux-Systemen ist ld.so

2.2.1 Generierungsmethode

Verwenden Sie die Zwischendatei bill.o. das Programm (dynamischer Loader), das für das Laden gemeinsam genutzter Bibliotheken und Analysefunktionen verantwortlich ist, auf die von Clientprogrammen verwiesen wird fred.o generiert die gemeinsam genutzte Bibliothek libfoo.so gcc -shared -fpic -o libfoo.so bill.o fred.ogcc -shared -fpic -o libfoo.so bill.o fred.o

1Welche Verbindung besteht zwischen Bibliotheken und Header-Dateien unter Linux?

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

1Welche Verbindung besteht zwischen Bibliotheken und Header-Dateien unter Linux?

然后指定搜索路径

1Welche Verbindung besteht zwischen Bibliotheken und Header-Dateien unter Linux?

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

1Welche Verbindung besteht zwischen Bibliotheken und Header-Dateien unter Linux?

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

1Welche Verbindung besteht zwischen Bibliotheken und Header-Dateien unter Linux?

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

1Welche Verbindung besteht zwischen Bibliotheken und Header-Dateien unter Linux?1Welche Verbindung besteht zwischen Bibliotheken und Header-Dateien unter Linux?

Nachdem die gemeinsam genutzte Bibliothek generiert wurde, muss sie im Standardsuchverzeichnis abgelegt werden. Zusätzliche Speicherorte für die Suche nach gemeinsam genutzten Bibliotheken können in der Datei /etc/ld.so.conf konfiguriert werden. Nachdem Sie diese Datei geändert haben, führen Sie den Befehl ldconfig aus, um sie zu verarbeiten.

Der Inhalt von /etc/ld.so.conf ist include /etc/ld.so.conf.d/*.conf. Erstellen Sie in diesem Verzeichnis Ihre eigenen Dynamiken Link-Bibliothekspfad-Konfigurationsdatei mylib.conf

1Welche Verbindung besteht zwischen Bibliotheken und Header-Dateien unter Linux?🎜🎜Dann geben Sie den Suchpfad an🎜🎜1Welche Verbindung besteht zwischen Bibliotheken und Header-Dateien unter Linux?🎜🎜Link zum Generieren einer ausführbaren Dateigcc -o main program.o -lfoo -L.🎜🎜1Welche Verbindung besteht zwischen Bibliotheken und Header-Dateien unter Linux?🎜🎜🎜ldd🎜 Tool kann dazu verwendet werden Ausführbare Dateien analysieren. Gemeinsam genutzte Bibliotheken, die für den Dateibetrieb erforderlich sind. 🎜🎜 .png"/>🎜🎜Sie können beim Kompilieren des Zielcodes auch den Suchpfad der .so-Bibliothek angeben, indem Sie ihn über den gcc-Parameter -Wl,-rpath angeben, z. B. gcc main.cpp -lfoo - L. -Wl,-rpath=.-Wl bedeutet, dass die folgenden Parameter an das Linkprogramm ld übergeben werden (da gcc automatisch ld aufruft, wenn mehrere dynamische Bibliothekssuchen angegeben werden). Pfade, verwenden Sie Doppelpunkte zwischen den Pfaden: „getrennt. 🎜🎜🎜🎜🎜Verwandte Empfehlungen: „🎜Linux-Video-Tutorial🎜“🎜

Das obige ist der detaillierte Inhalt vonWelche Verbindung besteht zwischen Bibliotheken und Header-Dateien unter Linux?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Vorheriger Artikel:Was ist Linux Xorg?Nächster Artikel:Was ist Linux Xorg?