C++中如何应用.so共享库

今天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


  這樣就能夠正確執行了!!!
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值