Hubungan antara perpustakaan dan fail pengepala dalam Linux: terdapat pengisytiharan fungsi dalam fail pengepala, dan takrifan fungsi yang dilaksanakan dalam fail perpustakaan perlu diisytiharkan dalam fail pengepala. Semasa menulis program, anda perlu menggunakan fail pengepala untuk memberikan definisi pemalar dan pengisytiharan panggilan ke fungsi sistem dan fungsi perpustakaan dan perpustakaan ialah koleksi fungsi yang disusun, iaitu, koleksi fail sasaran ".o". Ia ditulis mengikut prinsip kebolehgunaan semula dan secara amnya terdiri daripada satu set fungsi yang saling berkaitan untuk melaksanakan tugas bersama.
Persekitaran pengendalian tutorial ini: sistem linux7.3, komputer Dell G3.
Dalam kod sumber aplikasi umum, terdapat pengisytiharan fungsi dalam fail pengepala, dan fail pustaka melaksanakan takrif fungsi dalam pustaka perlu diisytiharkan dalam fail pengepala.
Apabila menulis atur cara, kita perlu menggunakan fail pengepala untuk memberikan definisi pemalar dan fungsi sistem dan Perisytiharan perpustakaan daripada panggilan fungsi, fail pengepala ini terletak di /usr/include
. Fail pengepala ini terletak dalam direktori yang boleh dicari secara automatik oleh pengkompil, seperti /usr/include/X11 sistem tetingkap X dan /usr/include/c++ GNU C++.
Apabila memanggil gcc, anda boleh menggunakan bendera -I
untuk memasukkan fail pengepala yang disimpan dalam subdirektori atau lokasi bukan standard lain, seperti gcc -I/usr/openwin/include fred.c
Perpustakaan ialah koleksi fungsi yang disusun, iaitu koleksi fail sasaran.o Ia ditulis mengikut prinsip kebolehgunaan semula dan umumnya terdiri daripada a set interaktif Himpunan fungsi yang berkaitan untuk melaksanakan tugas biasa.
Fail perpustakaan sistem Linux standard biasanya disimpan dalam direktori /lib
dan /usr/lib
. Secara lalai, pemaut GCC hanya mencari pustaka bahasa C standard, yang merupakan isu sejarah. Kita mesti mematuhi nama fail perpustakaan dengan konvensyen tertentu dan menentukannya pada baris arahan.
Fail pustaka sentiasa bermula dengan lib, kemudian nyatakan jenis pustaka itu Bahagian terakhir .a mewakili pustaka fungsi statik dan .so mewakili pustaka fungsi kongsi (iaitu, pustaka. Pustaka pautan dinamik DLL di bawah Windows). Bendera
seperti gcc -o fred fred.c /usr/lib/libm.a
atau gcc -o fred fred.c -lm
-L
menambah laluan carian perpustakaan kepada pemaut, seperti gcc -o x11fred -L /usr/openwin/lib x11fred.c -1X11
Pustaka statik berakhir dengan .a, juga dipanggil fail arkib Apabila menjana program boleh laku, fail perpustakaan statik dipautkan dan fail boleh laku yang dihasilkan adalah lebih besar. . Boleh dijalankan tanpa fail perpustakaan statik.
Mula-mula buat dua fail sumber fred.c dan bill.c
Kemudian gunakan gcc -c
untuk menyusun dan menjana dua fail sasaran
Kemudian tulis pengepala untuk kedua-dua fail fungsi ini , buat pengisytiharan fungsi
dan kemudian masukkan fail pengepala dalam fungsi utama dan panggil salah satu fungsi perpustakaan
kemudian Susun fungsi utama dan paut main.o dengan bill.o yang dijana sebelum ini, yang boleh dilaksanakan dengan betul
Seterusnya kita jana fail perpustakaan, gunakan ar arkib untuk mencipta fail arkib dan Dengan menambah fail sasaran, ia menggabungkan beberapa fail berasingan ke dalam satu fail besar. ar crv libfoo.a bill.o fred.o
Kemudian kita perlu menggunakan perintah ranlib
untuk menjana jadual kandungan untuk perpustakaan fungsi.
Kemudian kami memautkan fail perpustakaan dengan fail program.o yang dijana sebelum ini dan pelaksanaan berjaya
Juga Gunakan -l
untuk menentukan pustaka fungsi dan -L
untuk menentukan lokasi bukan standard.
Kita boleh menggunakan perintah nm
untuk melihat fungsi yang disertakan dalam fail sasaran, pustaka fungsi atau fail boleh laku , yang boleh digunakan untuk analisis pembongkaran. Apabila program dicipta, ia hanya mengandungi fungsi yang sebenarnya diperlukan dalam pustaka fungsi Walaupun terdapat pengisytiharan semua fungsi dalam fail pengepala, pemaut tidak akan memautkan kesemuanya.
Perbandingan perpustakaan statik antara Linux dan Windows
Apabila banyak aplikasi berjalan pada masa yang sama dan kesemuanya menggunakan fungsi daripada perpustakaan fungsi yang sama, akan terdapat banyak salinan fungsi yang sama dalam ingatan, pembaziran memori Dan storan luaran! ! Apabila program menggunakan pustaka fungsi, ia tidak lagi mengandungi kod fungsi semasa memaut, tetapi merujuk kepada kod kongsi yang boleh diakses semasa masa jalan Apabila atur cara yang disusun dimuatkan ke dalam memori untuk pelaksanaan, rujukan fungsi dihuraikan dan Panggilan dibuat. ke pustaka kongsi, dan jika perlu, pustaka kongsi dimuatkan ke dalam memori. Iaitu, sistem hanya boleh menyimpan satu salinan pustaka kongsi dalam ingatan untuk banyak aplikasi dipanggil, atau hanya satu salinan boleh disimpan dalam memori luaran. Selain itu, perpustakaan kongsi boleh dikemas kini secara bebas daripada aplikasi yang bergantung padanya, dan aplikasi tidak perlu dikompilasi semula.
Dalam sistem Linux, program (pemuat dinamik) yang bertanggungjawab untuk memuatkan perpustakaan kongsi dan fungsi penghuraian yang dirujuk oleh program klien ialah ld.so
Gunakan fail perantaraan bill.o fred.o untuk menjana perpustakaan kongsi libfoo.so gcc -shared -fpic -o libfoo.so bill.o fred.o
Selepas pustaka kongsi dijana, ia mesti diletakkan dalam direktori carian standard. Lokasi tambahan untuk mencari perpustakaan kongsi boleh dikonfigurasikan dalam fail /etc/ld.so.conf
Selepas mengubah suai fail ini, laksanakan arahan ldconfig
untuk memprosesnya. Kandungan /etc/ld.so.conf
ialah include /etc/ld.so.conf.d/*.conf
, buat fail konfigurasi laluan perpustakaan pautan dinamik anda sendiri dalam direktori ini mylib.conf
dan kemudian nyatakan Laluan carian
Pautan untuk menjana fail boleh lakugcc -o main program.o -lfoo -L.
ldd alat boleh digunakan untuk analisis Pustaka kongsi yang diperlukan untuk menjalankan fail boleh laku
juga boleh ditentukan semasa menyusun kod sasaran Laluan carian .so perpustakaan ditentukan melalui parameter gcc -Wl,-rpath
, seperti gcc main.cpp -lfoo -L. -Wl,-rpath=.
-Wl, bermakna parameter berikut akan dihantar ke program pautan ld (kerana gcc akan memanggil ld secara automatik apabila menentukan berbilang laluan carian perpustakaan dinamik, gunakan titik bertindih ":" untuk memisahkan laluan.
Cadangan berkaitan: "Tutorial Video Linux"
Atas ialah kandungan terperinci Apakah kaitan antara perpustakaan dan fail pengepala di Linux?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!