靜態庫編譯
① 怎麼編譯windows上libx264靜態庫
mingw編譯出來的靜態庫後綴名為.a,編譯出來的動態庫的導入庫後綴名為.dll.a,而在windows下後綴名為.lib的庫可能是靜態庫也可能是動態庫的導入庫。 mingw編譯出來的動態庫的導入庫可以直接在vc中直接使用,例如 #pragma comment(lib, "libx264
② 求助,依賴的動態庫包含靜態庫,編譯報錯說找
動態鏈接庫和靜態鏈接庫一般是編譯集成一系列的介面(函數)
在程序源代碼編譯完成後通過編譯器編譯並通過鏈接器與這些庫進行鏈接
動態鏈接庫與靜態鏈接庫的區別在於鏈接器在進行鏈接時靜態庫會被直接編譯進程序里
而動態鏈接庫並不會,我們這里將這些鏈接庫稱作依賴(動態庫和靜態庫)
程序的運行需要這些依賴,程序在靜態鏈接後該程序本身便已包含該依賴
而動態鏈接後的程序本身本不包含該依賴,這些依賴需要執行者自行安裝進操作系統(動態庫、運行時庫)
程序運行時會動態地載入這些庫
linux上動態庫一般的後綴後為.so
靜態庫一般的後綴為.a
由於靜態鏈接會直接將庫編譯進程序里所以靜態編譯後的程序相較於動態鏈接所要大
這就是因為靜態鏈接會將鏈接庫編譯進程序里的原因,所以佔用就要大了
出於這種原因,靜態庫不易於維護與更新,如果鏈接庫中有實現有bug等需要更新則需要更新整個程序,因為靜態庫被編譯進程序中了
但動態庫就沒有這種情況了,因為動態庫是程序運行時動態載入的,所以我們只需要更新動態庫而不需要更新所有依賴該庫的程序(軟體)
另一方面,很多程序的開發都會使用到相同的鏈接庫,也就是很多程序(軟體)會有相同的依賴
如果將這些依賴全部靜態編譯的話將會造成存儲資源佔用過多而造成資源浪費
而使用動態庫的方式這些程序(軟體)則可以共享一個鏈接庫,而不需要每個程序都帶一個鏈接庫,這樣就大大地減少了存儲資源佔用空間
③ 我編譯A靜態庫的時候依賴了B靜態庫,我編譯的程序依賴A靜態庫和B靜態庫,這樣B靜態庫是不是會有重復的部分
靜態庫在程序的鏈接階段被復制到了程序中。
你用依賴這個詞。
程序編譯一般需經預處理、編譯、匯編和鏈接幾個步驟。
在鏈接步驟中,靜態庫才會被復制。
因為靜態庫在程序的鏈接階段被復制到了程序中,和程序運行的時候沒有關系。
存在幾個鏈接?
那麼就幾分拷貝。
④ 如何將c語言的math.h編譯為靜態庫在mcu上使用
庫函數的源碼你是看不到的。要找實現的話得去網路。自帶的都是編譯好的東西(用到時直接調用)不是原C程序。
至於sin()的實現。如果你學過高數應該知道泰勒展開。
不知道的話直接給你公式:sin(x)=x-(x^3)/3!+(x^5)/5!+...(按這規律求和下去,x是弧度)
用一個for循環。要精確的話循環的次數多些就行
⑤ 如何對靜態庫編譯增加arm64的支持
之前app用到的libmp3lame.a靜態庫,也要支持64位的模擬器(x86_64)和64位的真機(arm64)指令集。需要重新編譯
查閱了下資料,按照如下步驟,並做了些注釋和改動
1.http。//sourceforge。net/projects/lame/files/lame/3.99/ 下載lame的最新版本解壓到一個文件夾里例如 lame,全路徑如下/Users/8wm/Desktop/lame
2.下載build的腳本,我這里使用的是國外一個朋友的分享
https。//github。com/kewlbear/lame-ios-build
下載之後得到lame-build.sh拷貝到文件夾/Users/8wm/Desktop/lame
3.用bbedit或者其他編輯器打開這個腳本,按照注釋修改
4.打開Terminals,
輸入
cd /Users/8wm/Desktop/lame
chmod 777 lame-build.sh
sudo -s#
輸入系統密碼
./lame-build.sh
開始編譯,編譯完成之後。生成fat-lame目錄和thin-lame目錄,分別存放合並所有指令集的靜態庫,以及各指令集的靜態庫.
根據所需, lame.h和libmp3lame.a文件到project里,就可以正常使用了。
可以使用命令行,查看換個庫支持的指令集。
lipo -info libmp3lame.a
Architectures in the fat file: libmp3lame.a are: armv7 armv7s i386 x86_64 arm64
以下是build的腳本,請注意黃色的字和注釋。
#!/bin/sh
make distclean
CONFIGURE_FLAGS="--disable-shared --disable-frontend"
ARCHS="arm64 armv7s x86_64 i386 armv7"
# directories
# SOURCE是下載lame源碼包,解壓後的目錄,可以把sh腳本放到這個目錄,source改為""
SOURCE=""
# FAT是所有指令集build後,輸出的目錄,所有靜態庫被合並成一個靜態庫
FAT="fat-lame"
# SCRATCH是下載lame源碼包,解壓後的目錄,必須是絕對路徑
SCRATCH="/Users/8wm/Desktop/lame"
# must be an absolute path
# THIN 各自指令集build後輸出的靜態庫所在的目錄,每個指令集為一個靜態庫
THIN=`pwd`/"thin-lame"
COMPILE="y"
LIPO="y"
if [ "$*" ]
then
if [ "$*" = "lipo" ]
then
# skip compile
COMPILE=
else
ARCHS="$*"
if [ $# -eq 1 ]
then
# skip lipo
LIPO=
fi
fi
fi
if [ "$COMPILE" ]
then
CWD=`pwd`
echo "$CWD/$SOURCE........."
for ARCH in $ARCHS
do
echo "building $ARCH..."
mkdir -p "$SCRATCH/$ARCH"
cd "$SCRATCH/$ARCH"
if [ "$ARCH" = "i386" -o "$ARCH" = "x86_64" ]
then
PLATFORM="iPhoneSimulator"
if [ "$ARCH" = "x86_64" ]
then
SIMULATOR="-mios-simulator-version-min=7.0"
HOST=x86_64-apple-darwin
else
SIMULATOR="-mios-simulator-version-min=5.0"
HOST=i386-apple-darwin
fi
else
PLATFORM="iPhoneOS"
SIMULATOR=
HOST=arm-apple-darwin
fi
XCRUN_SDK=`echo $PLATFORM | tr '[:upper:]' '[:lower:]'`
CC="xcrun -sdk $XCRUN_SDK clang -arch $ARCH"
#AS="$CWD/$SOURCE/extras/gas-preprocessor.pl $CC"
CFLAGS="-arch $ARCH $SIMULATOR"
CXXFLAGS="$CFLAGS"
LDFLAGS="$CFLAGS"
CC=$CC $CWD/$SOURCE/configure \
$CONFIGURE_FLAGS \
--host=$HOST \
--prefix="$THIN/$ARCH" \
CC="$CC" CFLAGS="$CFLAGS" LDFLAGS="$LDFLAGS"
make -j3 install
cd $CWD
done
fi
if [ "$LIPO" ]
then
echo "building fat binaries..."
mkdir -p $FAT/lib
set - $ARCHS
CWD=`pwd`
cd $THIN/$1/lib
for LIB in *.a
do
cd $CWD
lipo -create `find $THIN -name $LIB` -output $FAT/lib/$LIB
done
cd $CWD
cp -rf $THIN/$1/include $FAT
fi
⑥ 簡述gcc編譯時使用靜態庫和動態庫的區別
函數庫分為靜態庫和動態庫兩
種。靜態庫在程序編譯時會被連接到目標代碼中,程序運行時將不再需要該靜態庫。動態
庫在程序編譯時並不會被連接到目標代碼中,而是在程序運行是才被載入,因此在程序運
行時還需要動態庫存在。
⑦ linux靜態庫怎麼編譯
linux庫有動態與靜態兩種,動態通常用.so為後綴,靜態用.a為後綴。例如:libhello.so
libhello.a
為了在同一系統中使用不同版本的庫,可以在庫文件名後加上版本號為後綴,例如:
libhello.so.1.0,由於程序連接默認以.so為文件後綴名。所以為了使用這些庫,通常使用建立符號連接的方式。
ln
-s
libhello.so.1.0
libhello.so.1
ln
-s
libhello.so.1
libhello.so
動態庫和靜態庫的區別:
當要使用靜態的程序庫時,連接器會找出程序所需的函數,然後將它們拷貝到執行文件,由於這種拷貝是完整的,所以一旦連接成功,靜態程序庫也就不再需要了。然而,對動態庫而言,就不是這樣。動態庫會在執行程序內留下一個標記『指明當程序執行時,首先必須載入這個庫。由於動態庫節省空間,linux下進行連接的預設操作是首先連接動態庫,也就是說,如果同時存在靜態和動態庫,不特別指定的話,將與動態庫相連接。
兩種庫的編譯產生方法:
第一步要把源代碼編繹成目標代碼。以下面的代碼hello.c為例,生成hello庫:
/*
hello.c
*/
#include
void
sayhello()
{
printf("hello,world\n");
}
用gcc編繹該文件,在編繹時可以使用任何全法的編繹參數,例如-g加入調試代碼等:
gcc
-c
hello.c
-o
hello.o
1.連接成靜態庫
連接成靜態庫使用ar命令,其實ar是archive的意思
$ar
cqs
libhello.a
hello.o
2.連接成動態庫
生成動態庫用gcc來完成,由於可能存在多個版本,因此通常指定版本號:
$gcc
-shared
-wl,-soname,libhello.so.1
-o
libhello.so.1.0
hello.o
另外再建立兩個符號連接:
$ln
-s
libhello.so.1.0
libhello.so.1
$ln
-s
libhello.so.1
libhello.so
這樣一個libhello的動態連接庫就生成了。最重要的是傳gcc
-shared
參數使其生成是動態庫而不是普通執行程序。
-wl
表示後面的參數也就是-soname,libhello.so.1直接傳給連接器ld進行處理。實際上,每一個庫都有一個soname,當連接器發現它正在查找的程序庫中有這樣一個名稱,連接器便會將soname嵌入連結中的二進制文件內,而不是它正在運行的實際文件名,在程序執行期間,程序會查找擁有
soname名字的文件,%b
⑧ VS2010修改C++項目為「靜態庫中使用MFC」編譯問題
(1)項目 -> **屬性 -> 配置屬性 -> 常規 -> MFC的使用 :在靜態庫中使用MFC。
(2)項目 -> **屬性 -> 配置屬性 -> C/C++ -> 代碼生成 -> 運行庫 :多線程(/MT)。
2 在debug的時候要選 /MTd, Release 版本的再用 /MT
⑨ lib文件靜態庫和dll文件動態連接庫有什麼不同,分別有什麼作用!在編譯時各自起什麼作用
簡單來說 靜態庫 編譯完 之後 就一個光光 exe
動態庫編譯完 之後 是要 一個exe 和這個dll同時在 才能運行。
好處?dll可以動態載入,也可以被多個程序調用,
lib庫 存在版本必須一致的問題,例如2008的代碼 連接的時候 必須要連接 2008編譯出來的lib庫,
而dll 或許 不需要這么強制對應。
⑩ 如何編譯生成和調用靜態庫
如何編譯動態庫
gcc test1.c test2.c -shared -fPIC -o libtest.so
使用動態庫
gcc main.c -L. -ltest -o a.out
(
-L : 表示需要庫的路徑
-l:表示需要庫的名稱,如libtest.so,名稱則為test
)
(ps:執行a.out時有可能提示找不到libtest.so文件,這時需要把庫文件放入到/lib等目錄下,或者添加環境變數LD_LIBRARY_PATH,包含有庫文件的路徑即可)
如何編譯靜態庫
gcc -c test1.c test2.c
ar -r libtest.a test1.o test2.o
使用靜態庫
gcc main.c -static -L. -ltest -o a.out
(
-static:可強制編譯時使用靜態庫,如果不使用這個參數,而靜態庫與動態庫同名的話,會優先使用動態庫