Linux下GCC 編譯時如何指定連結庫
-l引數就是用來指定程式要連結的庫,-l引數緊接著就是庫名,那麼庫名跟真正的庫檔名有什麼關係呢?就拿數學庫來說,他的庫名是m,他的庫檔名是libm.so,很容易看出,把庫檔名的頭lib和尾.so去掉就是庫名了。當我們自已要用到一個第三方提供的庫名字libtest.so,那麼我們只要把libtest.so拷貝到/usr/lib裡,編譯時加上-ltest引數,我們就能用上libtest.so庫了(當然要用libtest.so庫裡的函式,我們還需要與libtest.so配套的標頭檔案)。
放在/lib和/usr/lib和/usr/local/lib裡的庫直接用-l引數就能連結了,但如果庫檔案沒放在這三個目錄裡,而是放在其他目錄裡,這時我們只用-l引數的話,連結還是會出錯,出錯資訊大概是:“/usr/bin/ld: cannot find -lxxx”,也就是連結程式ld在那3個目錄裡找不到libxxx.so,這時另外一個引數-L就派上用場了,比如常用的X11的庫,它在/usr/X11R6/lib目錄下,我們編譯時就要用-L/usr/X11R6/lib -lX11引數,-L引數跟著的是庫檔案所在的目錄名。再比如我們把libtest.so放在/aaa/bbb/ccc目錄下,那連結引數就是-L/aaa/bbb/ccc
-ltest,另外,大部分libxxxx.so只是一個連結,以RH9為例,比如libm.so它連結到/lib/libm.so.x,/lib/libm.so.6又連結到/lib/libm-2.3.2.so,如果沒有這樣的連結,還是會出錯,因為ld只會找libxxxx.so,所以如果你要用到xxxx
庫,而只有libxxxx.so.x或者libxxxx-x.x.x.so,做一個連結就可以了ln -s libxxxx-x.x.x.so libxxxx.so,手工來寫連結引數總是很麻煩的,還好很多庫開發包提供了生成連結引數的程式,名字一般叫xxxx-config,一般放在/usr/bin目錄下,比如gtk1.2的連結引數生成程式是gtk-config,執行gtk-config --libs就能得到以下輸出"-
L/usr/lib -L/usr/X11R6/lib -lgtk -lgdk -rdynamic -lgmodule -lglib -ldl -lXi -lXext -lX11 -lm",這就是編譯一個gtk1.2程式所需的gtk連結引數,xxx-config除了--libs引數外還有一個引數是--cflags用來生成頭文
件包含目錄的,也就是-I引數,在下面我們將會講到。你可以試試執行gtk-config --libs --cflags,看看輸出結果現在的問題就是怎樣用這些輸出結果了,最笨的方法就是複製貼上或者照抄,聰明的辦
法是在編譯命令列里加入這個`xxxx-config --libs --cflags`,比如編譯一個gtk程式:gcc gtktest.c `gtk-config --libs --cflags`這樣就差不多了。注意`不是單引號,而是1鍵左邊那個鍵。
除了xxx-config以外,現在新的開發包一般都用pkg-config來生成連結引數,使用方法跟xxx-config類似,但xxx-config是針對特定的開發包,但pkg-config包含很多開發包的連結引數的生成,用pkg-config --list-all命令可以列出所支援的所有開發包,pkg-config的用法就是pkg -config pagName --libs --cflags,其中pagName是包名,是pkg-config--list-all裡列出名單中的一個,比如gtk1.2的名字就是gtk+,pkg- config gtk+ --libs --cflags的作用跟gtk-config --libs --cflags是一樣的。比如:gcc gtktest.c `pkg-config gtk+ --libs --cflags`。
相關推薦
Linux下gcc編譯生成動態連結庫*.so檔案並呼叫它
動態庫*.so在linux下用c和c++程式設計時經常會碰到,最近在網站找了幾篇文章介紹動態庫的編譯和連結,總算搞懂了這個之前一直不太瞭解得東東,這裡做個筆記,也為其它正為動態庫連結庫而苦惱的兄弟們提供一點幫助。1、動態庫的編譯下面通過一個例子來介紹如何生成一個動態庫。這裡
Linux下GCC 編譯時如何指定連結庫
-l引數和-L引數 -l引數就是用來指定程式要連結的庫,-l引數緊接著就是庫名,那麼庫名跟真正的庫檔名有什麼關係呢?就拿數學庫來說,他的庫名是m,他的庫檔名是libm.so,很容易看出,把庫檔名的頭lib和尾.so去掉就是庫名了。當我們自已要用到一個第三方提供的庫名字libtest.so,那麼我們只要把lib
linux下gcc編譯 .c檔案生成動態連結庫 .so檔案,並測試呼叫該連結庫
簡單介紹:linux中so檔案為共享庫,和windows下dll相似;so可以共多個程序呼叫,不同程序呼叫同一個so檔案,所使用so檔案不同;so原檔案不需要main函式;例項,1.通過mysqlTest.c中的函式mysql(),生成一個libmysql.so連結庫#inc
linux下g++ 編譯時動態庫和靜態庫的連結和標頭檔案問題
原來編譯的時候都是用的很隨意,沒用系統的總結一下,這幾天在編譯的時候遇到一些下問題,於是就總結一下,省得過幾天又給忘了。 1.動態庫和靜態庫簡介 靜態庫在程式連結的時候會自動的連結到程式裡,所以一旦編譯完成,靜態庫就不需要了,靜態庫以.a結尾。 動態庫在編譯時不會被連線到目的碼中,而是在程式執行
Linux下使用cmake生成動態連結庫並使用
使用cmake生成庫主要要注意三個資料夾 (1)原始檔資料夾(2)中間資料夾(編譯生成的.o等檔案的資料夾)(3)安裝資料夾(最終可用的庫所在的資料夾) 使用庫的步驟(1)在工程檔案中包括庫函式的標頭檔案(可為絕對路徑,也可配置全域性環境變數用相對路徑)(2)在CMakeLists.txt或整合開發環境中
ARP報文的傳送與接收(Linux下gcc編譯)
ARP報文的傳送與接收 這篇文章主要是關於ARP報文的傳送與接收,學習TCP/IP協議,還是多動手做一些測試對協議的理解比較深刻,所以自己寫了一份比較簡單的關於ARP的原始碼, 主要是起到記錄作用,方便以後回顧,當然,如果有大俠能提出問題,幫助我改進缺點是萬
Gcc 編譯時指定巨集
gcc 編譯指定巨集 那在makefile裡面 gcc -DMACRONAME=MACRODEF 或者 gcc -DMACRONAME 這樣就定義了預處理巨集,編譯的時候可選程式碼就會
GCC 編譯使用動態連結庫和靜態連結庫--及先後順序----及環境變數設定總結
1 庫的分類 根據連結時期的不同,庫又有靜態庫和動態庫之分。 靜態庫是在連結階段被連結的(好像是廢話,但事實就是這樣),所以生成的可執行檔案就不受庫的影響了,即使庫被刪除了,程式依然可以成功執行。 有別於靜態庫,動態庫的連結是在程式執行的時候被連結的。所以,即使
Linux下gcc生成和使用靜態庫和動態庫詳解
一、基本概念 1.1什麼是庫 在windows平臺和linux平臺下都大量存在著庫。 本質上來說庫是一種可執行程式碼的二進位制形式,可以被作業系統載入記憶體執行。 由於windows和linux的平臺不同(主要是編譯器、彙編器和聯結器的不同),因此二者庫的二
GCC 編譯使用動態連結庫和靜態連結庫
1 庫的分類 根據連結時期的不同,庫又有靜態庫和動態庫之分。 靜態庫是在連結階段被連結的(好像是廢話,但事實就是這樣),所以生成的可執行檔案就不受庫的影響了,即使庫被刪除了,程式依然可以成功執行。 有別於靜態庫,動態庫的連結是在程式執行的時候被連結的。所以,即使程式編譯完,
linux下GCC編譯C程式(一)
GCC的"-lm"選項,它告訴GCC檢視系統提供的數學庫(libm)。因為Linux和UNIX的系統函式庫通常以"lib"為字首,所以我們假設它存在。真正的函式庫位置隨系統的不同而不同,但它一般會位於目錄/lib或/usr/lib中,在這些目錄中還有數以百計的其他必需的系統函式庫。 4. 共享函式庫與靜態函
GCC編譯生成動態連結庫*.so檔案
動態庫*.so在linux下用c和c++程式設計時經常會碰到,最近在網站找了幾篇文章介紹動態庫的編譯和連結,總算搞懂了這個之前一直不太瞭解得東東,這裡做個筆記,也為其它正為動態庫連結庫而苦惱的兄弟們提供一點幫助。 1、動態庫的編譯 下面通過一個例子來介紹如何生成一個動態庫。
GCC 編譯使用動態連結庫和靜態連結庫的方法
1 庫的分類 根據連結時期的不同,庫又有靜態庫和動態庫之分。 靜態庫是在連結階段被連結的(好像是廢話,但事實就是這樣),所以生成的可執行檔案就不受庫的影響了,即使庫被刪除了,程式依然可以成功執行。 有別於靜態庫,動態庫的連結是在程式執行的時候被連結的。所以,即使程式
【編譯Boost庫】Linux下如何編譯和安裝Boost庫
前言 編譯比特幣錢包時,需要依賴Boost庫,由於編譯時間較長,在“試一試”中浪費好長時間,所以把可以成功的過程記錄下來吧。 下載Boost安裝包 通過wget工具下載 wget https://dl.bintray.com/boostorg/r
linux-gcc 編譯時頭文件和庫文件搜索路徑
con 行程 efi lib local 先後 objc 路徑 oot 一、頭文件 gcc 在編譯時尋找所需要的頭文件 : ※搜尋會從-I開始 ※然後找gcc的環境變量 C_INCLUDE_PATH,CPLUS_INCLUDE_PATH,OBJC_INCLUDE_PATH
arm-linux-gcc編譯時出現的一些小插曲-----64位系統需要32位的庫
最近由於工作的需要,重新弄起arm-linux-gcc編譯。離上一次弄這些有整整10年了。 我是在一臺64位的機器上實機安裝的 centos7 發行版,系統和交叉編譯器的安裝過程自是沒話說,問題出在使用arm-linux-gcc編譯 arm程式時, $ arm-linu
linux-gcc 編譯時標頭檔案和庫檔案搜尋路徑
一、標頭檔案 gcc 在編譯時尋找所需要的標頭檔案 : ※搜尋會從-I開始 ※然後找gcc的環境變數 C_INCLUDE_PATH,CPLUS_INCLUDE_PATH,OBJC_INCLUDE_PATH ※再找內定目錄 /usr/include /usr/local/incl
Linux下執行時指定動態庫
開發程式的過程中,經常會用到一些動態庫,但是動態庫是無法編譯到程式中的,所以安裝程式時可能就需要將動態庫放到預設的路徑下/usr/lib或者/usr/local/lib/ 下等目錄,否則,在執行程式時,就會有類似“libxxx.so找不到”的提示。 那麼如果沒有許可
編譯32位windows系統下可用的JVMTI動態連結庫
這3天研究如何編譯32位windows系統下可用的jVMTI動態連結庫。中間過程很多時間都在搭建各種環境,其他時間在學習編譯和各個系統的相關知識,總的來說,受益匪淺。記錄一下3天踩過的坑和解決方法。
(轉)如何將arm-linux-gcc編譯的動態連結helloworld在Android上執行
如何將arm-linux-gcc編譯的動態連結helloworld在Android上執行 https://blog.csdn.net/kangear/article/details/78537352 標題起得有點長,但是少一個字都不足以描述清楚我要說的。Android上要用C程式無非兩種方法