今天boss給分配了一些編程的任務要求,每一個方法形成一個。so庫,一聽之下有點蒙了,以前編程中還真沒有用過這個玩意!各種找資料,現在就把一些比較基本的東西來整理一下,以供參考!
什么是。so文件呢?so是unix的動態連接庫,是二進制文件,作用相當于windows下的。dll文件,這一說大家大概就明白了,其實。so就是在我們在運行時動態調用的一個庫文件,為什么我們要使用。so呢,其實是這樣我們有時候在編程的過程中,遇到一類問題的解決需要我們抽象出共有的對象在c++中我們稱之為基類,但是具體的實現需要有他的子類來完成,這樣的情況下一般假如后續要修改程序的話我們只要修改子類的內容,基類是不會修改的,這樣我們可以把子類的實現封裝在一個。so文件中,在運行時動態加載它。修改時也只需要修改這個子類文件重新編譯成。so即可。這樣就大大增加了程序的可移植性,是一個良好的編程習慣!
說了這么多,到底怎么來使用。so文件呢,下面我來舉一個很簡單的例子!這里用到了三個文件。
test.h:
#inlude<iostream>
using namespace std;
void hello();
test.cpp
#include"test.h"
void hello()
{
cout《"hello world"《endl;
}
hello.cpp
#include"test.h"
int main()
{
hello();
return 0;
}
我們這里將test.cpp打包成。so文件:
g++ test.cpp -shared -o libtest.so
在編譯hello.cpp的時候動態的加載它:
g++ hello.cpp -L. -ltest -o hello
我們可以通過ldd的命令看看是否加載了該動態庫libtest.so;
ldd hello
linux-gate.so.1 => (0xb7771000)
libtest.so => /usr/lib/libtest.so (0xb7759000)
libstdc++.so.6 => /usr/lib/i386-linux-gnu/libstdc++.so.6 (0xb766e000)
libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0xb74ef000)
libm.so.6 => /lib/i386-linux-gnu/libm.so.6 (0xb74c5000)
/lib/ld-linux.so.2 (0xb7772000)
libgcc_s.so.1 => /lib/i386-linux-gnu/libgcc_s.so.1 (0xb74a7000)
這樣我們發現已經加載了該庫文件;
./hello
就能得到我們執行的結果了!
加載過程中遇到的問題:
肯能會出現庫找不到的情況,因為系統在執行命令的時候/usr/lib中找我們的庫文件,我只需加一個軟鏈接就行了;
sudo ln -s ~/libtest.so /usr/lib/test.so
這樣就能夠正確執行了!!!
什么是。so文件呢?so是unix的動態連接庫,是二進制文件,作用相當于windows下的。dll文件,這一說大家大概就明白了,其實。so就是在我們在運行時動態調用的一個庫文件,為什么我們要使用。so呢,其實是這樣我們有時候在編程的過程中,遇到一類問題的解決需要我們抽象出共有的對象在c++中我們稱之為基類,但是具體的實現需要有他的子類來完成,這樣的情況下一般假如后續要修改程序的話我們只要修改子類的內容,基類是不會修改的,這樣我們可以把子類的實現封裝在一個。so文件中,在運行時動態加載它。修改時也只需要修改這個子類文件重新編譯成。so即可。這樣就大大增加了程序的可移植性,是一個良好的編程習慣!
說了這么多,到底怎么來使用。so文件呢,下面我來舉一個很簡單的例子!這里用到了三個文件。
test.h:
#inlude<iostream>
using namespace std;
void hello();
test.cpp
#include"test.h"
void hello()
{
cout《"hello world"《endl;
}
hello.cpp
#include"test.h"
int main()
{
hello();
return 0;
}
我們這里將test.cpp打包成。so文件:
g++ test.cpp -shared -o libtest.so
在編譯hello.cpp的時候動態的加載它:
g++ hello.cpp -L. -ltest -o hello
我們可以通過ldd的命令看看是否加載了該動態庫libtest.so;
ldd hello
linux-gate.so.1 => (0xb7771000)
libtest.so => /usr/lib/libtest.so (0xb7759000)
libstdc++.so.6 => /usr/lib/i386-linux-gnu/libstdc++.so.6 (0xb766e000)
libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0xb74ef000)
libm.so.6 => /lib/i386-linux-gnu/libm.so.6 (0xb74c5000)
/lib/ld-linux.so.2 (0xb7772000)
libgcc_s.so.1 => /lib/i386-linux-gnu/libgcc_s.so.1 (0xb74a7000)
這樣我們發現已經加載了該庫文件;
./hello
就能得到我們執行的結果了!
加載過程中遇到的問題:
肯能會出現庫找不到的情況,因為系統在執行命令的時候/usr/lib中找我們的庫文件,我只需加一個軟鏈接就行了;
sudo ln -s ~/libtest.so /usr/lib/test.so
這樣就能夠正確執行了!!!