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 -pthread

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

  • -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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM