『壹』 在linux下寫makefile時,如何鏈接一個靜態庫
gcc a1.o a2.o a3.o a4.a a5.a -o canrun.bin
按此格式就可以將很多不管是什麼名字的目標文件鏈接為一個可執行的文件,在運行時在SHELL下輸入:
./canrun.bin就可以運行了。
『貳』 linux怎樣實現c語言動態庫與靜態庫的鏈接
Linux系統中靜態庫是.a文件,編譯鏈接.a文件只需要加上.a文件的完整的文件路徑就可以了,比如:
gcc -o hello hello.c /usr/lib/libm.a
Linux系統的動態庫是系統中的.so文件,編譯鏈接動態庫需要用-L參數指定動態庫的搜索路徑,還要用-l(這個是小寫的L)指定動態庫的名字,比如:
gcc -o hello hello.c -L/usr/openssl/lib -lcrypto
『叄』 Linux下的靜態庫和動態庫
靜態庫
可以把它想像成是一些代碼的集合,在可執行程序運行前就已經加到了代碼中,成為了執行程序的一部分,一般是以.a為後綴的文件名,Windows下後綴為.lib。靜態庫的命名也分為三部分,1、前綴:lib,2、庫的名稱:隨意,如lisi,3、後綴:.a。
靜態庫優缺點
上面簡單介紹了靜態庫,那它自然也會有優缺點,這里來介紹下它的優缺點。
優點:1、在最後,函數庫是被打包到應用程序中的,實現函數本地化、定址方便、高效。2、程序在運行的時候,與函數庫沒有關系,移植性更強。
缺點:1、消耗資源較大,每個進程在使用靜態庫的時候,都要復制一份才可以,這也就造成了內存的消耗。2、在程序更新、部署、發布的時候,使用靜態庫相對麻煩,如果一個靜態庫更新了,那它的應用程序都需要重新編譯,再發送給用戶,有的時候可能只是一個小的改動,但對於用戶來說,會導致整個程序重新下載。
動態庫
在程序編譯時不會被連接到目標代碼中,在後期運行時才會載入,不同的應用程序如果調用相同的庫,內存中只有一份共享庫的拷貝,也就避免了空間的浪費問題。一般以.so作為文件後綴名,也分為三部分:1、前綴:lib,2、庫名稱:自定義,3、後綴:.so
動態庫優缺點
優點:1、節省內存2、部署、升級相對方便,只需要更換動態庫,再重新啟動服務即可。
缺點:1、載入速度比靜態庫慢2、移植性較差,需要把所有用到的動態庫進行移植。
『肆』 linux下編寫c++,include的那些頭文件在什麼地方
C/C++程序在linux下被編譯和連接時,GCC/G++會查找系統默認的include和link的路徑,以及自己在編譯命令中指定的路徑。
1、#include <stdio.h>,直接到系統指定目錄去查找頭文件。
系統默認路徑為:/usr/include,/usr/local/include,/usr/lib/gcc-lib/i386-Linux/2.95.2/include(gcc庫文件的路徑,各個系統不一致)
2、#include "stidio.h",會先到當前目錄查找頭文件,如果沒找到在到系統指定目錄查找。
3、gcc編譯時查找頭文件,按照以下路徑順序查找:
gcc編譯時,可以設置-I選項以指定頭文件的搜索路徑,如果指定多個路徑,則按照順序依次查找。比如,gcc -I /usr/local/include/node a.c
gcc會查找環境變數C_INCLUDE_PATH,CPLUS_INCLUDE_PATH中指定的路徑。
(4)linux靜態庫路徑擴展閱讀:
應用程序代碼編譯過程:
編譯器根據頭文件提供的庫函數介面形式,來編譯代碼,然後生成目標文件;然後,再使用鏈接器將這個目標文件與系統庫鏈接;最終生成應用程序。代碼包含了自己寫的內容,還有系統提供好的現成的庫函數,整個結合起來才形成一個完整的程序。
庫函數的頭文件,在編譯的時候被使用,而庫函數的代碼段(庫文件),在鏈接的時候被使用。
example:
應用程序代碼在使用一個系統調用的時候,例如printf()函數,需要指定包含的頭文件stdio.h;另外,在鏈接的時候對應的鏈接libc.a(筆者電腦文件所在目錄:/usr/lib/i386-linux-gnu/libc.a)。
總結一下,編寫應用程序,需要使用linux系統提供的庫函數。具體實現起來,需要頭文件和庫文件。頭文件是需要我們編寫應用程序的時候,在源文件開頭添加的;而庫文件則需要配置編譯環境進行指定搜索目錄。