1. 程式人生 > >c/c++ 多執行緒 ubuntu18.04 boost編譯與執行的坑

c/c++ 多執行緒 ubuntu18.04 boost編譯與執行的坑

多執行緒 boost編譯與執行的坑

背景:因為要使用boost裡的多執行緒庫,所以遇到了下面的坑。

系統版本:ubuntu18.04

一,安裝boost

1,去boost官網下載 boost_1_XX_0.tar.gz

2,解壓

tar -zxvf boost_1_65_0.tar.gz  

3,進去解壓後的資料夾

cd boost_1_XX_0 

4,編譯

bootstrap.sh 

5,安裝

./b2

注意:安裝完成後,會有資訊列印到控制檯,最重要的就是:

  • 標頭檔案所在的路徑(我的例子:/home/ys/Downloads/boost_1_68_0
  • 庫檔案所在的路徑(我的例子:/home/ys/Downloads/boost_1_68_0/stage/lib)

二,編譯使用了boost庫裡的多執行緒庫的程式碼的坑,比如下面的程式碼。如果下面的程式碼想編譯通過,必須使用下面的命令。

g++ -g -I/home/ys/Downloads/boost_1_68_0 boost-shared-mutex.3.13.cpp -std=c++11 -L/home/ys/Downloads/boost_1_68_0/stage/lib  -lboost_thread -lboost_system

解釋一下各個引數的作用:

  • -I:因為使用了<boost/thread/shared_mutex.hpp>標頭檔案,這個標頭檔案只在你的安裝的資料夾裡,假設系統找不到這個資料夾,所以就找不這個標頭檔案,指定了-I就是告訴編譯器去哪裡找這個標頭檔案。

  • -l:程式要使用的外部庫(動態庫,二進位制檔案),庫名為boost_thread和boost_system,這2個庫對應的實際檔案為,libboost_thread.so和libboost_system.so,也就是去掉了lib和.so。如果這2個庫檔案編譯器能夠找到就可以編譯,但是如果找不到就需要用-L引數來告訴編譯器這2個檔案在哪裡

  • -L:指定庫檔案所在的路徑。如果不指定出下面的錯誤。

    /usr/bin/ld: cannot find -lboost_thread
    /usr/bin/ld: cannot find -lboost_system
    collect2: error: ld returned 1 exit status

    gcc/g++ 引數詳解

引數太長了,好麻煩。

省略-I的辦法,在/etc/profile檔案里加下面一行,也就是標頭檔案所在的路徑,以後就可以不輸入-I裡,修改(需要root許可權)後需要重啟系統

export CPLUS_INCLUDE_PATH=/home/ys/Downloads/boost_1_68_0

省略-L的辦法,網上一大堆,但實驗了都不好用,嗚嗚嗚。

三,終於編譯好了,執行一下,Duang,又崩了,說找不到庫。原因是:執行時系統要去找這2個庫檔案boost_thread,boost_system,但是這2個庫檔案不在系統能找到的地方,所以崩了。

解決辦法:編輯/etc/ld.so.conf檔案末尾,加下面一行,也就是庫檔案所在的路徑,重啟系統後,就能找到它們啦。

/home/ys/Downloads/boost_1_68_0/stage/lib
#include <map>
#include <string>
#include <mutex>
#include <boost/thread/shared_mutex.hpp>

int main(){

}

c/c++ 學習互助QQ群:877684253

本人微信:xiaoshitou5854