linux編譯連接
1. linux下如何查看.a.so文件是由什麼文件編譯連接
linux下如何查看.a.so文件是由什麼文件編譯連接
so文件就是通常說的動態鏈接庫,就跟windows下的dll文件差不多。
ko是內核模塊文件,驅動之類的啥的。
不過在linux系統下文件的後綴多數情況下只是個標識,有可能代表不了文件的真實屬性的。
至於怎麼編寫,就跟用VS編譯dll或者lib文件差不多,把你的代碼編譯完成以後命名為相應的後綴就好了。
我了解的一般都是C程序,java屬於腳本語言,程序多數情況下是被解釋執行的,所以一般不需要編譯成庫。至於如何編譯成庫文件,如果你在windows下做過開發的話應該不用我解釋太多。實在不知道的話可以再問我哈~~
希望以上回答能對你有所幫助。
2. Linux 中,在使用g++編譯、連接程序時,怎樣調用多個靜態庫文件
在編譯命令行中,將使用的靜態庫文件放在源文件後面就可以了。比如:
gcc -L/usr/lib myprop.c libtest.a libX11.a libpthread.a -o myprop
其中-L/usr/lib指定庫文件的查找路徑,編譯器默認在當前目錄下先查找指定的庫文件。
3. LINUX下要在C中嵌入Python,編譯的時候怎樣解決庫的連接問題
gcc編譯時,當使用動態庫編譯可以按照幾種寫法1.gcctest.c./libSDL2-2.so2.gcctest.c-lSDL2-23.gcctest.c-L/home/test-lSDL2-2一般的編譯參數都是按照2或3去寫2寫法的含義是從/lib或者/usr/lib目錄下尋找名稱為SDL2-2的庫,即尋找/lib/libSDL2-2.so或者/usr/lib/libSDL2-2.so文件進行鏈接,當然如果沒有動態庫就會去找靜態庫,再沒有應該就會在編譯時報錯3寫法的含義是從-L參數首先從指定的目錄中尋找需要鏈接的庫文件,隨後再去尋找系統文件夾中是否存在需要的庫1寫法的含義是將當前目錄下的./libSDL2-2.so.0文件鏈接進最終文件,因此執行readelf-aa.out後在動態庫部分所看到的路徑就是./libSDL2-2.so.0,進而在執行文件時僅會從當前目錄下尋找libSDL2-2.so.0文件,當執行文件時所在的目錄下沒有該文件時就會出現找不到庫文件的操作你第二次操作時,因為function.so庫文件與a.out文件在同一個目錄,同時也是在該目錄下執行的ldd操作及運行a.out,a.out在載入動態庫時從當前目錄下找到了所需要的庫文件,此時能夠執行成功(ldd命令實質是一個腳本,通過設置環境變數運行動態庫鏈接器來輸出所有待鏈接的動態庫)。你可以試試將a.out拷貝至其他目錄再次運行,將出現和第一次操作時一樣的現象,找不到function.so文件。具體的解決方法就是修改編譯參數,將./libSDL2-2.so.0修改為-lSDL2-2並將libSDL2-2.so.0文件拷貝至/usr/lib目錄下,並且可能因為沒有修改鏈接器的緩存文件(將可能找不到帶版本號後綴的動態庫),需要在/usr/lib目錄下建立一個文件連接(ln-slibSDL2-2.so.0libSDL2-2.so)或者直接修改名稱為libSDL2-2.so
4. linux下gcc編譯時如何連接到mraa庫
-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 -lgmole -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`。
5. linux 編譯怎麼連接動態庫
Linux的動態庫文件是以lib字樣開頭的.so文件,編譯鏈接動態庫有兩個要點:一個是需要用-L選項指定動態庫的搜索路徑,這個搜索路徑是需要連接的so文件的大致路徑,比如/usr/openssl/lib;另外還需要用-l(這個是小寫的L)選項指定動態庫的名字,比如下面這條編譯命令:
gcc -o hello hello.c -L/usr/openssl/lib -lcrypto
6. linux編譯找不到mysql連接庫
把/usr/lib/mysql下文件改名或刪除
系統會先找到/滾搭usr/lib/mysql下的文件,發現不兼容,會殲隱自動跳過。大改拿
7. linux 編譯鏈接
鏈接有問題是找不到庫文件 將庫的路徑加到/etc/ld.so.conf裡面就行了 再ldconfig一下
8. 在linux環境下對c語言程序編譯連接後執行該程序為什麼在命令行中加./
因為Linux有許多環境變數,其中有一個指定路徑的,你輸入的命令(也包括執行程序的命令),系統先到這些路徑中去圓大查詢,如果其中包含了該語句就執行了,最後都沒有查到才執汪掘行當前目錄中的程序,用./強制執行當前目錄下的程序就是避免這個橘陵豎意外(環境變數指定路徑中與當前目錄中要執行的程序同名),省得執行了一個程序還搞不清執行的是否當前目錄中要執行的那個了。
9. Linux下編譯程序,如何同時連接兩個庫文件,gcc命令應該怎麼寫。
-L後的應該是路徑,本例應該是-L/usr/lib/,-l後應該是庫的名字,注意,這里庫的名字是吧庫"libapi.so"去掉前面的"lib"和後面的".so",應該是-lapi.而且一個-L和-l對應一個庫.所以你的應該改為:
gcc -g -o test.exe test.c -L/usr/lib/ -lapi -L/usr/lib/ -lpk11.
還有,.exe文件是windows下的可執行文件格式,linux下不這么用,但是就本例而言也能運行.
10. linux中編譯時怎麼連接動態庫
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