2014-10-07 49 views
0

我試圖在Centos 7盒子上安裝rose compiler infrastructure。通常我會在玫瑰編譯器郵件列表上纏住人,但我相信問題在於boost庫。使用定製編譯器構建boost以支持rose編譯器基礎結構

首先,玫瑰是通過4.4.x到一些嚴格的要求,構建

  • GCC,版本4.0(含)
  • gfortran,版本4.2.x版通過4.4.x到(含)
  • 提振,版本1.36.0通過1.45.0(含)

問題,是海灣合作委員會的普通版附帶的Centos 7是4.8.2版本和Boost庫的正常版本是1.53 ....所以它是重新編譯hel我爲他:)。

因此,我下載了gcc-4.4.7源代碼並編譯爲/ opt/gcc447。我確實運行了測試套裝並獲得了預期的通過次數並失敗,因此我確信編譯器工具鏈正在工作。

我還下載了boost-1.45的源代碼,並將其構建並安裝到/opt/boost-1.45中。現在

,運行配置腳本玫瑰我得到這個錯誤:

CC=gcc44 CXX=g++44 ../rose/configure --prefix=/home/******/bin/rose --with-boost=/opt/boost-1.45.0 
checking for ROSE Git version information in '../rose'... 9a977c899a09c17903dd3005b88ae7d2c06bfacf 1377627277 

Configuring ROSE, version 0.9.5a (9a977c899a09c17903dd3005b88ae7d2c06bfacf) 
.... 
In ROSE/configure: ac_boost_path = /opt/boost-1.45.0 
checking for GraphViz's dot program in path... yes 
checking whether the Boost::Thread library is available... no 
checking whether the Boost::Date_Time library is available... yes 
checking for toupper in -lboost_date_time... no 
checking for toupper in -lboost_date_time... (cached) no 
checking for toupper in -lboost_date_time... (cached) no 
configure: error: Could not link against boost_date_time ! 

做檢查正常,我要確保libboost_data_time.so.1.45.0存在(它),它是正確的文件類型和權限不是不可靠的。望着的config.log,我覺得這一點:

configure:13690: g++44 -o conftest -I/opt/boost-1.45.0/include -L/opt/boost-1.45.0/lib conftest.cpp -lboost_date_time >&5 
/opt/boost-1.45.0/lib/libboost_date_time.so: undefined reference to `std::out_of_range::~out_of_range()@GLIBCXX_3.4.15' 
collect2: ld returned 1 exit status 
configure:13690: $? = 1 
configure: failed program was: 
| #ifdef __cplusplus 
| extern "C" 
| #endif 
| char toupper(); 
| int main() 
| { 
|  return toupper(); 
|  ; 
| return 0; 
| } 

所以,我複製失敗(命名它toupper_test.cpp),並試圖用默認的編譯器編譯第一個程序:

[******@broadsword rose-build]$ g++ -v 
Using built-in specs. 
COLLECT_GCC=g++ 
COLLECT_LTO_WRAPPER=/usr/libexec/gcc/x86_64-redhat-linux/4.8.2/lto-wrapper 
Target: x86_64-redhat-linux 
Configured with: ../configure --prefix=/usr --mandir=/usr/share/man --infodir=/usr/share/info --with-bugurl=http://bugzilla.redhat.com/bugzilla --enable-bootstrap --enable-shared --enable-threads=posix --enable-checking=release --with-system-zlib --enable-__cxa_atexit --disable-libunwind-exceptions --enable-gnu-unique-object --enable-linker-build-id --with-linker-hash-style=gnu --enable-languages=c,c++,objc,obj-c++,java,fortran,ada,go,lto --enable-plugin --enable-initfini-array --disable-libgcj --with-isl=/builddir/build/BUILD/gcc-4.8.2-20140120/obj-x86_64-redhat-linux/isl-install --with-cloog=/builddir/build/BUILD/gcc-4.8.2-20140120/obj-x86_64-redhat-linux/cloog-install --enable-gnu-indirect-function --with-tune=generic --with-arch_32=x86-64 --build=x86_64-redhat-linux 
Thread model: posix 
gcc version 4.8.2 20140120 (Red Hat 4.8.2-16) (GCC) 
[******@broadsword rose-build]$ g++ -o toupper1 -I/opt/boost-1.45.0/include -L/opt/boost-1.45.0/lib toupper_test.cpp -lboost_date_time 
[******@broadsword rose-build]$ 

並且測試程序編譯成功,但是嘗試使用gcc的4.4.7版編譯時產生:

[******@broadsword rose-build]$ /opt/gcc447/bin/g++44 -v 
Using built-in specs. 
Target: x86_64-unknown-linux-gnu 
Configured with: ../gcc-4.4.7/configure --prefix=/opt/gcc447 --program-suffix=44 --enable-languages=c,c++,objc,java,fortran --enable-shared --enable-threads=posix --disable-checking --with-system-zlib --enable-__cxa_atexit --disable--libunwind-exceptions 
Thread model: posix 
gcc version 4.4.7 (GCC) 
[******@broadsword rose-build]$ /opt/gcc447/bin/g++ -o toupper2 -I/opt/boost-1.45.0/include -L/opt/boost-1.45.0/lib toupper_test.cpp -lboost_date_time 
bash: /opt/gcc447/bin/g++: No such file or directory 
[******@broadsword rose-build]$ /opt/gcc447/bin/g++44 -o toupper2 -I/opt/boost-1.45.0/include -L/opt/boost-1.45.0/lib toupper_test.cpp -lboost_date_time 
/opt/boost-1.45.0/lib/libboost_date_time.so: undefined reference to `std::out_of_range::~out_of_range()@GLIBCXX_3.4.15' 
collect2: ld returned 1 exit status 

並且編譯失敗。

所以,當我意識到我用默認的編譯器編譯了boost後,我並不太驚訝,但似乎無法使用4.4版本的編譯器編譯boost。我嘗試了一個數字東西的;

  • 設置的gcc版本的用戶配置文件
  • 在設定的gcc版本的項目配置文件
  • 在嘗試設置命令行環境變量CC和CXX(ok..i在這裏越來越絕望)
  • 將/ opt/gcc447/bin/gcc47與/ opt/gcc47/bin/gcc進行同步鏈接(與其他程序一樣)並確保/ opt/gcc447/bin /是第一個在路徑

什麼都沒有迄今爲止工作。

我沒有想法在這裏嘗試...任何人有一個建議或提示?

謝謝!

+0

你可以添加更多關於boost編譯的信息嗎?例如,你創建了user-config.jam,你在那個文件中寫的是什麼?之後你運行「./b2」,你有什麼選擇,比如「toolset =」? – fghj 2014-10-08 02:43:54

+0

boost的初始構建是通過命令序列'./bootstrap.sh --prefix = .....完成的。 ./bjam --prefix = .....',之後我嘗試使用gcc添加使用行; 4.4.7;/opt/gcc447/bin/g ++;'到不同的文件....(1)user-config.jam; (2)project-config.jam和(3)tools/build/v2/user-config.jam(參見http://stackoverflow.com/questions/7240635/how-to-install-boost-on-linux-with -custom-位置的-GCC)。我還厭倦了在SO問題的各種答案中提出的幾個命令行選項(目前無法找到鏈接)。 – thurizas 2014-10-08 16:51:33

回答

0

爲我解決問題。 我的默認編譯器是gcc 4.9,但是 我想用/usr/bin/gcc-4.7.3編譯

我使用boost_1_45_0。

我把這樣的配置文件到我的主目錄:

cat /home/evgeniy/user-config.jam 

using gcc : : /usr/bin/g++-4.7.3 ;

注:應該是在主目錄中,而不是在提升的源代碼樹

然後我跑

./bootstrap.sh 
./bjam toolset=gcc-4.7.3 

檢查所有事情是否按預期工作,您無法RY:

strace -f ./bjam toolset=gcc-4.7.3 > /tmp/log 2>&1 & 
grep execve /tmp/log 

,如果一切順利,看到類似:

execve("/usr/lib/gcc/x86_64-pc-linux-gnu/4.7.3/...

附:

我第一次把用戶config.jam中進入增壓源代碼樹, 的根,看到:

移動用戶config.jam中所有的作品如預期後

execve("/usr/lib/gcc/x86_64-pc-linux-gnu/4.9.0/...

+0

非常感謝。工作! – thurizas 2014-10-08 18:22:27