Heim > Artikel > Betrieb und Instandhaltung > Welche Verbindung besteht zwischen Bibliotheken und Header-Dateien unter Linux?
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.
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.
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
库是一组已经编译好的函数的集合,也就是目标文件.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
Beim 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
/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
🎜gcc -c
, um zwei zu kompilieren und zu generieren Zieldatei🎜🎜🎜 🎜Schreiben Sie dann Header-Dateien für diese beiden Funktionen und erstellen Sie Funktionsdeklarationen🎜🎜🎜🎜Dann fügen Sie die Header-Datei in die Hauptfunktion ein und rufen eine der Bibliotheksfunktionen auf🎜🎜🎜🎜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. 🎜🎜🎜🎜Dann Wir haben die Bibliotheksdatei mit der zuvor generierten program.o-Datei verknüpft und die Ausführung war erfolgreich🎜🎜🎜🎜Sie können auch -l
verwenden, um die Funktionsbibliothek anzugeben, und -L
, um die Nicht-Funktionsbibliothek anzugeben. Standardstandort. 🎜🎜🎜🎜🎜 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. 🎜
Statischer Bibliotheksvergleich zwischen Linux und Windows
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
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.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
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
gcc -o main program.o -lfoo -L.
🎜🎜🎜🎜🎜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!