多線程 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(){
}