當前位置:首頁 » 編程軟體 » g編譯靜態庫

g編譯靜態庫

發布時間: 2022-07-12 10:08:52

『壹』 C++通過什麼編譯器編譯成的靜態庫給ios調用

用的是gcc編譯器或者xcode編譯就可以。
在開發過程中,經常會碰到一些在不同工程中經常用到的部分,把這些部分抽取出來做成一個靜態庫往往是一個比較好的做法。xcode里就有製作靜態庫的模板,相關的製作步驟網上也有很多,但在實際的操作中,還是有不少細節方面需要注意。以下是我碰到的一些問題總結。

1.編譯release版本的庫
在「Manage Schemes」中,將「Build Configuration」的選項改為「Release」即可。如圖:

2.靜態庫中包含category
如果你在靜態庫工程中使用了category,那麼你可能會碰到鏈接問題,解決的辦法就是需要同時在生成靜態庫的工程和使用靜態庫的工程中使用「-all_load」編譯選項,即在對應target的"Build Settings"中的「Other Linker Flags」選項添加「-all_load」。注意:使用靜態庫的工程中是一定要加該編譯選項的!!至於生成靜態庫的工程中加不加沒有試過,不過建議還是加上該編譯選項。

3.靜態庫支持的SDK版本
為了使自己的靜態庫盡可能多的支持IOS的系統版本,應該在"IOS Deployment Target"這個選項中選擇自己所需的IOS版本。設置如下圖,這個是我的靜態庫工程中的配置,紅框框起來的是我修改過的選項。

4.自動拷貝頭文件
在工程對應的target的「Build Phases」下添加「Copy Headers」的選項。該選項默認是沒有的,添加方法是點擊下方的「Add Build Phase」按鈕後選擇後即可添加。該選項下有3個子選項,分別是Public,Private,Project。通過點擊下方的加號,可以將工程中的頭文件添加到「Project」中,在其中的對應頭文件點擊右鍵,選擇「Move to Public Group」,當頭文件移到「Pulic」後,編譯工程以後,在工程編譯後.a文件所在的路徑下,會同時出現一個"usr/local/include"的文件夾,其中的頭文件就是public group中的頭文件。這時只需將.a文件和這個路徑下的頭文件拷貝到所需工程文件即可。
轉載

『貳』 xcode 幾個文件怎麼編譯靜態庫

XCode項目中添加靜態庫的方法:
1、右擊target,選擇add
->
new
target
2、在彈出的
NewTarget
界面中選擇Cocoa
Touch
->
Static
Library
,為新
library
取個名字。
將源文件添加到這個庫。可以直接拖動現存源文件,也可以右擊
->
add
。注意選擇新建的庫為添加的
target

3、設置原項目,令其使用新建的庫。
4、右擊原項目的
target
,選擇
getInfo

5、選擇
General
選項卡。
6、向
linked
libraries
中添加新創建的庫
(即添加
.a
文件)。

『叄』 如何使用預編譯的靜態庫平台

tbb 2.2中提供了統一的頭文件:tbb.h,只要包含這個文件就可以使用所有tbb的庫了。為了使用起來方便,以及可以使用靜態庫,可以使用以下這些命令自己創建:

# 1. 先下載 tbb22_20090908oss_src.tgz, 去 http://www.threadingbuildingblocks.org

# 2. 解壓
tar -zxvf tbb22_20090908oss_src.tgz
cd tbb22_20090908oss

# 3. 編譯,沒必要直接make,很多東東其實不需要
make tbb && make tbbmalloc

# 4.編譯好的東東在build目錄下,不同的編譯器和操作系統,文件夾的名字不一樣
cd build/linux_ia32_gcc_cc4.1.0_libc2.4_kernel2.6.16.46_release

# 5.自己寫個命令把o文件打包成靜態庫
ar cqs libtbb.a *.o
cp libtbb.a ../../../
#再去預編譯頭文件
cd ../../include/tbb
g++ -o tbb.h.gch -x c++-header -c tbb.h -g -Wall -Werror -O2 -DNDEBUG
cp tbb.h.gch tbb.h ../../../
cd ../../../

『肆』 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

『伍』 在Linux下如何使用GCC編譯程序、簡單生成 靜態庫及動態庫

一個程序調用了一個動態庫,但是兩者之間有函數重名,導致運行時動態庫中的Linux下動態庫文件的擴展名為這樣,線程函數庫被稱作libthread.so。靜態庫的

『陸』 g++如何鏈接gcc生成的靜態庫文件

g++直接鏈接gcc生成的靜態庫文件,會出現以下錯誤:
[search@SY-0187 test]$ g++ test.cpp -o test -L. -lmyhelloc
/tmp/cc83gjbt.o: In function `main':
test.c:(.text+0x5): undefined reference to `hello()'
collect2: ld returned 1 exit status
找不到靜態庫中的函數,原因是:
c++的函數名的生成和c的函數名的生成不同,在c中只根據函數名和調用約定、c++還要加上參數類型列表,所以c++編譯器無法找到函數。
解決辦法:只要用extern 「C」 告訴編譯器使用c語言的函數名字修飾技術就可以了。
解決方法:
1.在cpp文件的include處,對c庫函數前加上 extern 「C」extern C{#include ../lib/libxxx.h}不推薦,原因是會出現以下錯誤:
[search@SY-0187 test]$ g++ -g get_value.cpp -o get_value -I./include -L./lib -lMymemcached -lmemcached
/usr/local/include/libmemcached/options.h:69: error: declaration of C function 'memcached_return_t memcached_parse_configure_file(memcached_st*, memcached_array_st*)' conflicts with
/usr/local/include/libmemcached/options.h:66: error: previous declaration 'memcached_return_t memcached_parse_configure_file(memcached_st*, const char*, size_t)' here
不能識別重載的函數。
2.對.a include
的頭文件進行修改。
#ifdef __cplusplusextern C{#endif原先的.a的庫函數的聲明
#ifdef __cplusplus}#endif推薦使用這種方式
標準的C的頭文件形式是:
#ifndef __INCvxWorksh
#define __INCvxWorksh
#ifdef __cplusplusextern C {#endif/*...*/#ifdef __cplusplus}#endif#endif /* __INCvxWorksh */
具體的extern 「C」的作用見

『柒』 Linux 中,在使用g++編譯、連接程序時,怎樣調用多個靜態庫文件

在編譯命令行中,將使用的靜態庫文件放在源文件後面就可以了。比如:
gcc -L/usr/lib myprop.c libtest.a libX11.a libpthread.a -o myprop
其中-L/usr/lib指定庫文件的查找路徑,編譯器默認在當前目錄下先查找指定的庫文件。

『捌』 簡述gcc編譯時使用靜態庫和動態庫的區別

函數庫分為靜態庫和動態庫兩
種。靜態庫在程序編譯時會被連接到目標代碼中,程序運行時將不再需要該靜態庫。動態
庫在程序編譯時並不會被連接到目標代碼中,而是在程序運行是才被載入,因此在程序運
行時還需要動態庫存在。

『玖』 LInux 如何使用GCC編譯器將一個文件夾下的100個.o文件打包成一個靜態庫文件(.a)

你已經用gcc編譯出目標文件了,用ar工具打包成.a文件就行了啊,示例:


如上圖,假設我有test1.c,test2.c兩個源文件,先使用gcc -c *.c將源文件編譯成目標文件,可以看到,生成了test1.o,test2.o兩個目標文件,然後,使用ar命令:ar crv libtest.a *.o將該目錄下的所有目標文件打包生成了libtest.a文件。這樣,你在編譯的時候就可以直接使用這個靜態庫了。

熱點內容
新逍客20發動機壓縮比 發布:2025-02-08 17:58:10 瀏覽:115
qq號和密碼我都知道為什麼登不上 發布:2025-02-08 17:52:21 瀏覽:872
寶塔伺服器ip進不去 發布:2025-02-08 17:52:18 瀏覽:382
擔保中介源碼 發布:2025-02-08 17:14:37 瀏覽:412
手機存儲卡速度測試 發布:2025-02-08 17:02:57 瀏覽:25
洪恩編程 發布:2025-02-08 17:02:19 瀏覽:814
linux遠程式控制制 發布:2025-02-08 17:02:16 瀏覽:153
珠心算演算法 發布:2025-02-08 17:00:37 瀏覽:919
動態ip可以做伺服器么 發布:2025-02-08 17:00:33 瀏覽:220
oracle定義存儲過程 發布:2025-02-08 16:54:35 瀏覽:151