I am attempting to install rose compiler infrastructure on a Centos 7 box. Normally I would pester people on the rose compiler mailing list, but I believe the problem lies with the boost libraries.
First, rose has some strict build requirements
- gcc, version 4.0 through 4.4.x (inclusive)
- gfortran, version 4.2.x through 4.4.x (inclusive)
- boost, version 1.36.0 through 1.45.0 (inclusive)
The issue, is that the normal version of gcc that ships with Centos 7 is version 4.8.2 and normal version of boost libraries is 1.53 .... so it is recompile hell for me :).
So, I downloaded the source for gcc-4.4.7 and compiled it /opt/gcc447. I did run the test-suit and got the expected number of passes and fails so I am confident that the compiler tool chain is working.
I also downloaded the source for boost-1.45, built and installed it into /opt/boost-1.45.
Now, running the configure script for rose I get this error:
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 !
Doing the normal checks, I make sure that libboost_data_time.so.1.45.0 exists (it does), it is the correct file type and permissions are not wonky. Looking at the config.log, I find this:
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;
| }
So, I copy the program that failed (named it to toupper_test.cpp) and tried compiling first with the default compiler:
[******@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]$
and the test progam compiles successfully, however attempting to compiler with the 4.4.7 version of gcc yields:
[******@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
and the compilation fails.
So, after I realized that I compiled boost with the default compiler, I wasn't too surprised, but I can't seem to get boost compiled with the 4.4 version of the compiler..I've tried a number of things;
- setting the version of gcc in the user configuration file
- setting the version of gcc in the project configuration file
- trying to set the environmental variables CC and CXX on the command line (ok..i was getting desperate here)
- making sym-links from /opt/gcc447/bin/gcc47 to /opt/gcc47/bin/gcc (as the other programs as well) and making sure /opt/gcc447/bin/ was first in the path
Nothing to date has worked.
I am out of ideas to try here...anyone got a suggestion or hint?
Thanks!
Working for me solution. My default compiler is gcc 4.9, but I want compile with /usr/bin/gcc-4.7.3
I use boost_1_45_0.
I put such config file into my home directory:
Note: it should be in home directory, not in boost source tree
then I run
to check that all things works as expected you can try:
if all right you see something like:
P.S.
The first time I put user-config.jam into root of boost source tree, and saw:
after moving user-config.jam all works as expected.