使用自定义编译器构建boost以支持rose编译器基础结构

时间:2014-10-07 21:28:42

标签: c++ boost rose-compiler-framework

我正在尝试在Centos 7盒子上安装rose compiler infrastructure。通常我会在玫瑰编译器邮件列表中纠缠人,但我相信问题在于增强库。

首先,rose有一些严格的构建要求

  • gcc,版本4.0到4.4.x(含)
  • gfortran,版本4.2.x至4.4.x(含)
  • boost,版本1.36.0到1.45.0(含)

问题是,Centos 7附带的正常版本的gcc是版本4.8.2,正常版本的升级库是1.53 ....所以它重新编译地狱对我来说:)。

所以,我下载了gcc-4.4.7的源代码并编译了它/ opt / gcc447。我确实运行了测试套件并获得了预期的通过次数并且失败了所以我确信编译器工具链正在工作。

我还下载了boost-1.45的源码,并将其构建并安装到/opt/boost-1.45。

现在,为rose运行configure脚本我收到此错误:

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]$ 

并且测试程序编译成功,但尝试使用4.4.7版本的gcc编译产生:

[******@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版本编译升级.I&#39我试过很多事情;

  • 在用户配置文件中设置gcc的版本
  • 在项目配置文件中设置gcc的版本
  • 尝试在命令行上设置环境变量CC和CXX(ok ..我在这里越来越绝望)
  • 从/ opt / gcc447 / bin / gcc47到/ opt / gcc47 / bin / gcc(与其他程序一样)制作sym-links并确保/ opt / gcc447 / bin /在路径中排在第一位

迄今为止没有任何效果。

我没有想到这里尝试......有人有建议或暗示吗?

谢谢!

1 个答案:

答案 0 :(得分:0)

为我工作解决方案。 我的默认编译器是gcc 4.9,但是 我想用/usr/bin/gcc-4.7.3

进行编译

我使用boost_1_45_0。

我将这样的配置文件放入我的主目录:

cat /home/evgeniy/user-config.jam 
  

使用gcc :: /usr/bin/g++-4.7.3;

注意:它应该在主目录中,而不是在boost源树

然后我跑

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

要检查所有内容是否按预期工作,您可以尝试:

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 /...

P.S。

我第一次将user-config.jam放入boost源树的根目录, 并看到了:

  

的execve(“/ usr / lib中/ GCC / x86_64的-PC-Linux的GNU / 4.9.0 /...

移动user-config.jam后,

按预期工作。