最近才開(kāi)始接觸linux系統(tǒng)(Ubuntu 9.10),有些東西容易忘記,備忘之,待續(xù)。
1.g++編譯問(wèn)題
靜態(tài)庫(kù):
首先編譯libtest.cpp生成中間文件 libtest.o
g++ -c libtest.cpp
然后將其打包成靜態(tài)庫(kù) staticlib.a
ar -rc staticlib.a libtest.o
最后使用靜態(tài)庫(kù)與main.cpp進(jìn)行編譯得到執(zhí)行文件staticlib
g++ -o staticlib main.cpp staticlib.a
運(yùn)行./staticlib 成功!!
動(dòng)態(tài)庫(kù):
首先同樣需要編譯生成中間文件libteset.o,但一般加上-fPIC選項(xiàng)。
其意思是位置獨(dú)立代碼 ,指示編譯程序生成的代碼要適合共享庫(kù)的內(nèi)容這樣的代碼能夠根據(jù)載入內(nèi)存的位置計(jì)算內(nèi)部地址
g++ -c -fPIC libtest.cpp
然后打包 生成動(dòng)態(tài)庫(kù)dynamiclib.so
g++ -shared libtest.o -o dynamiclib.so
最后生成可執(zhí)行文件dynamiclib
g++ -o dynamic main.cpp dynamiclib.so
運(yùn)行./dynamiclib 結(jié)果出錯(cuò)了,提示找不到動(dòng)態(tài)庫(kù)。
原因是linux下動(dòng)態(tài)庫(kù)不像windows里那樣會(huì)自動(dòng)尋找當(dāng)前目錄下的dll,這需要把編譯出來(lái)的動(dòng)態(tài)庫(kù)放到系統(tǒng)的 /usr/lib 或 /lib下才能運(yùn)行程序。
或者還可以在編譯的時(shí)候就指定路徑也可以,例如在最后一步的時(shí)候:
g++ -o dynamic main.cpp ./dynamiclib.so
再次運(yùn)行./dynamiclib 成功!!
1.g++編譯問(wèn)題
//main.cpp
#include?<iostream>
using?namespace?std;
//headers
void?show();
int?main()
{
????cout<<"library test function show():?";
????show();
????return?0;
}
#include?<iostream>
using?namespace?std;
//headers
void?show();
int?main()
{
????cout<<"library test function show():?";
????show();
????return?0;
}
//libtest.cpp
#include?<iostream>
using?namespace?std;
void?show()
{
????cout<<"hello?library?test!"<<endl;
}
#include?<iostream>
using?namespace?std;
void?show()
{
????cout<<"hello?library?test!"<<endl;
}
靜態(tài)庫(kù):
首先編譯libtest.cpp生成中間文件 libtest.o
g++ -c libtest.cpp
然后將其打包成靜態(tài)庫(kù) staticlib.a
ar -rc staticlib.a libtest.o
最后使用靜態(tài)庫(kù)與main.cpp進(jìn)行編譯得到執(zhí)行文件staticlib
g++ -o staticlib main.cpp staticlib.a
運(yùn)行./staticlib 成功!!
動(dòng)態(tài)庫(kù):
首先同樣需要編譯生成中間文件libteset.o,但一般加上-fPIC選項(xiàng)。
其意思是位置獨(dú)立代碼 ,指示編譯程序生成的代碼要適合共享庫(kù)的內(nèi)容這樣的代碼能夠根據(jù)載入內(nèi)存的位置計(jì)算內(nèi)部地址
g++ -c -fPIC libtest.cpp
然后打包 生成動(dòng)態(tài)庫(kù)dynamiclib.so
g++ -shared libtest.o -o dynamiclib.so
最后生成可執(zhí)行文件dynamiclib
g++ -o dynamic main.cpp dynamiclib.so
運(yùn)行./dynamiclib 結(jié)果出錯(cuò)了,提示找不到動(dòng)態(tài)庫(kù)。
原因是linux下動(dòng)態(tài)庫(kù)不像windows里那樣會(huì)自動(dòng)尋找當(dāng)前目錄下的dll,這需要把編譯出來(lái)的動(dòng)態(tài)庫(kù)放到系統(tǒng)的 /usr/lib 或 /lib下才能運(yùn)行程序。
或者還可以在編譯的時(shí)候就指定路徑也可以,例如在最后一步的時(shí)候:
g++ -o dynamic main.cpp ./dynamiclib.so
再次運(yùn)行./dynamiclib 成功!!