『壹』 Ubuntu靜態庫怎麼使用
-供參考
linux 靜態庫的生成與使用
1、windows系統包括靜態鏈接庫(*.lib文件)和動態鏈接庫(*.dll文件)。
2、linux通常把庫文件存放在/usr/lib或/lib目錄下。
linux庫文件名:前綴lib、庫名和後綴3部分組成,其中動態鏈接庫以.so作為後綴,靜態鏈接庫通常以.a作為後綴。
區別:
靜態鏈接庫的代碼在編譯時就拷貝到應用程序中,這樣的優點是節省編譯時間動態庫是程序在開始運行後調用庫函數時才被載入。
靜態庫的創建和使用
1、在一個頭文件中聲明靜態庫所導出的函數。
2、在一個源文件中實現靜態庫所導出的函數。
3、編譯源文件,生成可執行代碼(.o文件)
4、將可執行代碼所在的目標文件加入到某個靜態庫中,並將靜態庫拷貝到系統默認的存放文件的目錄下。
例如:mylib.h聲明函數, mylib.c實現函數
1、編譯mylib.c生成目標文件:gcc -o mylib.o -c mylib.c
2、將目標文件加入到靜態庫中:ar rcs libmylib.a mylib.o
3、將靜態庫到linux的庫目錄 (/usr/lib 或者 /lib)下:
cp libmylib.a /usr/lib/libmylib.a
4、在調用庫函數的文件中添加#include "mylib.h"這樣就可調用靜態庫中函數
5、使用靜態庫編譯:gcc -o main main.c -l mylib
注意:編譯時無需帶上前綴和後綴。這就是為什麼在使用libxml2時librareis(-l)設置為:xml2
-梁兆鈴
『貳』 ubuntu下如何編譯C語言
1、首先打開ubnutu開發環境,直接輸入組合鍵ctrl+alt+t調出命令行界面。
『叄』 在ubuntu 下 HelloWorld.cpp 如何編譯成 HelloWorld.dll
gcc -g filename -o filename
編譯器命令
『肆』 如何在Linux下來調用用dll庫
微軟表示:我們的編譯器並沒有考慮生成的機器碼還要能夠讓linux運行……
開個玩笑,這個問題你得先了解編譯原理,windows下的庫有兩種,一種是native code,這種就別想了,它之所以能夠在windows上運行,當然是因為編譯器把它們編譯成了windows操作系統能夠識別的機器碼組織形式(嚴謹地來說,是鏈接器和載入器的不同,以及各自的系統調用壓根就沒有互映射性,導致了linux不能使用它們);第二種是.net平台編譯出來的類庫,這個是生成了中間語言(IL),跟java一樣,原則上是跨平台的,不過很多年以來,它只是原則上而已,從來就沒跨過。不過現在的好消息是,.net standard已經在包括linux之內的若干操作系統上完成了實現,所以如果你在.net平台上編寫一個完全符合.net standard庫的dll的話,它是可以跑在linux上的(嚴格來說,是某些非常新的linux發行版),這就是大名鼎鼎的.net core,也是微軟目前在軟體開發方向上大力投入的開源社區項目。所以總的來說,微軟還是充分考慮到你的這種應用需求的。如果你確實想完成把windows下的應用程序改到linux下面來運行,.net core是目前最好的選擇(因為還有個叫Mono的哥們也在做同樣的事兒,你同樣可以參考)
『伍』 Ubuntu下使用mingw-w64交叉編譯ffmpeg
網上大部分編譯windows版ffmpeg的教程都是基於msys+mingw的,完全運行在windows上。由於msys2的性能實在是太糟糕了,編譯速度太感人,因此決定研究Linux下使用mingw-w64交叉編譯
先是安裝ubuntu版的mingw-w64
sudo apt install mingw-w64
然後在configure ffmpeg的時候,在正常的配置項之後加上。
--arch=x86 --target-os=mingw32 --cross-prefix=i686-w64-mingw32-
上面是32位庫編譯的配置,64位的如下
--arch=x86_64 --target-os=mingw32 --cross-prefix=x86_64-w64-mingw32-
而且最好使用動態庫,靜態庫還需要鏈接一大堆mingw的庫實現,而且還可能鏈接失敗。但這樣編譯出來的動態庫,還需要依賴 libgcc_s_sjlj-1.dll。如果要移除這個依賴,configure的時候還要加上 --extra-ldflags='-static-libgcc'