當前位置:首頁 » 編程軟體 » 使用rpath編譯gcc

使用rpath編譯gcc

發布時間: 2022-10-01 13:43:04

linux編譯出現warning :ld-linux.so.3,needed by

需要這個動態庫libstdc++.so,因為沒有找到。
當然也可以加參數幫助編譯器找-rpath或者-rpath-link。
還是多學習一下編譯器的鏈接的原理。推薦看看bison源代碼分析,以便寫的代碼一次性通過。
不至於出現這樣那樣的錯誤。

❷ C++怎麼實現COM埠數擴展到256

還可以在編譯目標代碼時指定程序的動態庫搜索路徑。-Wl,表示後面的參數將傳給link程序ld(因為gcc可能會自動調用ld)。這里通過gcc 的參數"-Wl,-rpath,"指定(如例3所示)。當指定多個動態庫搜索路徑時,路徑之間用冒號":"分隔。
例3:
我們通過以下命令用源程序pos.c(見程序4)來創建動態庫libpos.so。
# gcc -c pos.c
# gcc -shared -fPCI -o libpos.so pos.o
#
#include <stdio.h>
void pos()
{
printf("./\n");
}
程序4: pos.c
因為我們需要在編譯目標代碼時指定可執行文件的動態庫搜索路徑,所以需要用gcc命令重新編譯源程序main.c(見程序2)來生成可執行文件pos。
# gcc -o pos main.c -L. -lpos -Wl,-rpath,./
#
再運行程序pos試試。
# ./pos
./
#

❸ mips GCC ld 的問題 在指定的目錄下有那個庫,單體是不能找到,很怪異的一個問題!

你這個問題是一個對初學者非常普遍的問題,在這里你需要了解動態載入庫的工作方式和以及ldconfig的用法。-L 表示庫路徑,-l 表示載入的庫。首先,請自已查看這些庫文件是否存在。注意文件與-l後面的文件名不同。比如上面的 -lmainPpDrv,表示載入庫 libmainPpDrv.so這個庫,後面的類似。具體的 gcc -l的用法你自己去查。在保證庫文件都存的情況下,第二步是理解動態載入庫的工作方式。具體四個方式來解決你的問題,最直接的方式,是把剛才找到的庫文件入到/usr/lib下面,然後再ldconfig 一下。注意ldconfig 要用root許可權下運行,如果找不到該命令,那就使用/sbin/ldconfig .第二種,在root 許可權下, vi /etc/ld.so.conf文件,把
/home/leizi/mvswitch/src 作為一行回到該文件中。 然後再ldconfig 一個. 第三種方法,使用LD_LIBRARY_PATH . 在終端下,輸入 LD_LIBRARY_PATH=/home/leizi/mvswitch/src export LD_LIBRARY_PATH. 第四種方法: 在你上面的編譯最後添加 -Wl,-rpath=/home/leizi/mvswitch/src 就可以了。另外再多說了一句,你的-L後面的路徑都是一樣的,因而可能只寫一個就行,寫的位置不限,只要在gcc 之後。
如需知道動態庫的載入方式,我有詳細的總結。如有疑問:QQ:524914698

❹ undefined reference to異常怎麼解決

Linux下編譯程序時,經常會遇到「undefined reference error」 報錯, 這里總結一些可能的原因和解決方案,給需要的朋友: 說道undefined reference error,先提一下Linux gcc鏈接規則: 鏈接的時候查找順序是: -L 指定的路徑, 從左到右依次查找 由 環境變數 LIBRARY_PATH 指定的路徑,使用":"分割從左到右依次查找 /etc/ld.so.conf 指定的路徑順序 /lib 和 /usr/lib (64位下是/lib64和/usr/lib64) 動態庫調用的查找順序: ld的-rpath參數指定的路徑, 這是寫死在代碼中的 ld腳本指定的路徑 LD_LIBRARY_PATH 指定的路徑 /etc/ld.so.conf 指定的路徑 /lib和/usr/lib(64位下是/lib64和/usr/lib64) 一般情況鏈接的時候我們採用-L的方式指定查找路徑, 調用動態鏈接庫的時候採用LD_LIBRARY_PATH的方式指定鏈接路徑. 另外注意一個問題,就是只要查找到第一個就會返回,後面的不會再查找. 比如-L./A -L./B -lx 在A中有libx.a B中有libx.a和libx.so, 這個時候會使用在./A的libx.a 而不會遵循動態庫優先的原則,因為./A是先找到的,並且沒有同名動態庫存在 對於動態鏈接庫,實際的符號定位是在運行期進行的.在編譯.so的時候,如果沒有把它需要的庫和他一起進行聯編,比如libx.so 需要使用uldict, 但是忘記在編譯libx.so的時候加上-luldict的話,在編譯libx.so的時候不會報錯,因為這個時候libx.so被認為是一個庫,它裡面存在一些不知道具體實現的符號是合法的,是可以在運行期指定或者編譯另外的二進製程序的時候指定. 如果是採用g++ -Lpath -lx 的方式進行編譯,鏈接器會發現所需要的uldict的符號表找不到從而報錯,但是如果是程序採用dlopen的方式載入,由於是運行期,這個程序在這個地方就直接運行報錯了.另外還有一種情況就是一個對外的介面在動態庫中已經聲明定義了,但是忘記實現了,這個時候也會產生類似的錯誤. 如果在運行期報出這樣的錯誤,就要注意是否是由於某些庫沒有鏈接進來或者某些介面沒有實現的原因產生 有了上述基礎,不難總結出,undefined reference error錯誤的原因可能來自以下幾方面: 1 沒有指定對應的庫(.o/.a/.so) 使用了庫中定義的實體,但沒有指定庫(-lXXX)或者沒有指定庫路徑(-LYYY),會導致該錯誤, 2 連接庫參數的順序不對 在默認情況下,對於-l 使用庫的要求是越是基礎的庫越要寫在後面,無論是靜態還動態 3 gcc/ld 版本不匹配 gcc/ld的版本的兼容性問題,由於gcc2 到 gcc3大版本的兼容性存在問題(其實gcc3.2到3.4也一定程度上存在這樣的問題) 當在高版本機器上使用低版本的機器就會導致這樣的錯誤, 這個問題比較常見在32位的環境上, 另外就在32位環境不小心使用了64位的庫或者反過來64位環境使用了32位的庫. 4 C/C++相互依賴和鏈接 gcc和g++編譯結果的混用需要保證能夠extern "C" 兩邊都可以使用的介面,在我們的64位環境中gcc鏈接g++的庫還需要加上 -lstdc++,具體見前文對於混合編譯的說明 5 運行期報錯 這個問題基本上是由於程序使用了dlopen方式載入.so, 但.so沒有把所有需要的庫都鏈接上,具體參加上文中對於靜態庫和動態庫混合使用的說明

❺ cc gcc編譯器怎麼使用

gcc --help可以看gcc的編譯選項

常用的有
gcc -c xcxcx.c : -c 編譯C代碼,生成該文件的obj文件
gcc xcxcx.o -o dest : -o 鏈接各個obj文件,生成目標執行程序
-I : (這里是大寫i) 表示頭文件路徑
-L : 表示庫文件路徑
-l : (這里是小寫的L) 表示需要鏈接的庫文件
-O: (這里是大寫英文o) 表示優化參數
-WALL: 表示warning等級

這里是一句完整的話
g++ -Wl,-rpath,/usr/local/Trolltech/QtEmbedded-static/lib -o Qt_V4L_ShowImage main.o myWidget.o v4lThread.o moc_myWidget.o moc_v4lThread.o -L/usr/local/Trolltech/QtEmbedded-static/lib -lQtGui -L/usr/local/tslib/lib -L/usr/local/Trolltech/QtEmbedded-static/lib -L/usr/local/lib -L/home/root/ffmpeg/lib -lts -lQtNetwork -lQtCore -lc -lgcc -lm -lrt -ldl -lpthread -lavcodec -lavformat -lavutil -lx264 -xvidcore -lcv -lhighgui -lcvaux -lcxcore

不過還是自己看一下gcc的help比較好,那裡講的全面些

❻ 求助undefined reference to xxx'的問題

Linux下編譯程序時,經常會遇到「undefined reference to XXX」 報錯,
這里總結一些可能的原因和解決方案,給需要的朋友:

說道undefined reference error,先提一下Linux gcc鏈接規則:

鏈接的時候查找順序是:

-L 指定的路徑, 從左到右依次查找
由 環境變數 LIBRARY_PATH 指定的路徑,使用":"分割從左到右依次查找
/etc/ld.so.conf 指定的路徑順序
/lib 和 /usr/lib (64位下是/lib64和/usr/lib64)
動態庫調用的查找順序:

ld的-rpath參數指定的路徑, 這是寫死在代碼中的
ld腳本指定的路徑
LD_LIBRARY_PATH 指定的路徑
/etc/ld.so.conf 指定的路徑
/lib和/usr/lib(64位下是/lib64和/usr/lib64)
一般情況鏈接的時候我們採用-L的方式指定查找路徑, 調用動態鏈接庫的時候採用LD_LIBRARY_PATH的方式指定鏈接路徑.

❼ linux中把.c的文件編譯成.so

就跟用VS編譯dll或者lib文件差不多,把代碼編譯完成以後,命名為相應的後綴就好了。

例如:
gcc -c -fPIC libst.c
生成 libst.o

然後
gcc -shared -fPIC -o libst.so libst.o
生成 libst.so 動態鏈接庫

把libst.so拷貝到系統默認庫目錄下,比如 /lib, /usr/lib 下
假定有 test.c 要引用這個庫
gcc -lst -o test test.c
然後就可以了

假如不能把libst.so拷貝到默認庫目錄下,比方說放在了
/home/aaa/lib 下
那麼就用這樣的語句來編譯test.c
gcc -L/home/aaa/lib -lst -Wl,-rpath=/home/aaa/lib -o test test.c

熱點內容
安卓70能用什麼軟體 發布:2025-05-16 01:45:09 瀏覽:480
編程發展史 發布:2025-05-16 01:38:52 瀏覽:528
android圖片氣泡 發布:2025-05-16 01:38:40 瀏覽:885
文件加密編輯器下載 發布:2025-05-16 01:30:41 瀏覽:343
linuxapacheyum安裝 發布:2025-05-16 01:30:31 瀏覽:476
大連賓利浴池wifi密碼是多少 發布:2025-05-16 01:25:36 瀏覽:172
緩存數據生產服務 發布:2025-05-16 01:08:58 瀏覽:584
普通電腦伺服器圖片 發布:2025-05-16 01:04:02 瀏覽:971
伺服器地址和埠如何區分 發布:2025-05-16 01:03:17 瀏覽:834
重新編目資料庫 發布:2025-05-16 00:54:34 瀏覽:514