I'm running a fedora 21 distribution, in which the default gcc is 4.9. I have a custom built gcc/g++ 4.8 in /usr/local/gcc48 (for instance, cuda requires gcc =< 4.8, and i use update-alternatives to chose this one) I have been compiling a few small programs with this version 4.8 without problem so far.
Now, I have been given a source code which makes uses of vtk libraries and others. If I use default gcc 4.9, cmake and make work fine. However, when using gcc48, I get:
/usr/lib64/vtk/libvtkCommonDataModel.so.1: référence indéfinie vers « std::__throw_out_of_range_fmt(char const*, ...)@GLIBCXX_3.4.20 »
/lib64/libicuuc.so.52: référence indéfinie vers « __cxa_throw_bad_array_new_length@CXXABI_1.3.8 »
collect2: erreur: ld a retourné 1 code d'état d'exécution
CMakeFiles/main.dir/build.make:365: recipe for target '../bin/main' failed
make[2]: *** [../bin/main] Error 1
CMakeFiles/Makefile2:60: recipe for target 'CMakeFiles/main.dir/all' failed
make[1]: *** [CMakeFiles/main.dir/all] Error 2
Makefile:76: recipe for target 'all' failed
make: *** [all] Error 2
I understand that is it a linker error, I tried to point LD_LIBRARY_PATH=/usr/local/gcc48/lib or LD_LIBRARY_PATH=/usr/local/gcc48/lib64, but i'm stuck.
What is the problem here ?
Thanks
Linking is performed when the input file are object files " .o " (instead of source file " . cpp " or " . c "). GCC uses a separate linker program (called ld.exe ) to perform the linking.
It just means that the code is position independent. A result of PIE is that Address Space Layout Randomization (ASLR) can be enabled (these days the default for security reasons, which is why also PIE is the default these days).
GNU C++ Compiler ( g++ ) is a compiler in Linux which is used to compile C++ programs. It compiles both files with extension . c and . cpp as C++ files. The following is the compiler command to compile C++ program.
To fix this error, correct the spelling of the main() function.
__cxa_throw_bad_array_new_length
was added in GCC 4.9. That's what the @CXXABI_1.3.8 version suffix means. You can look up those version codes here:
https://gcc.gnu.org/onlinedocs/libstdc++/manual/abi.html
This error means that you are trying to link an object file /usr/lib64/vtk/libvtkCommonDataModel.so.1
compiled by GCC 4.9 or later with libstdc++.so
or libsupc++.so
from GCC 4.8 or earlier. Either rebuild libvtkCommonDataModel.so
with GCC 4.8, or link against the correct libstdc++.so.
Edit: Actually, if you want to compile with a newer version of GCC but run with an older libstdc++.so, that can be done.
Compile with -D_GLIBCXX_USE_CXX11_ABI=0
if you want to compile with GCC 5+ and run with libstdc++.so from older GCC. See https://bugzilla.mozilla.org/show_bug.cgi?id=1153109 and Using dual ABI in the libstdc++ manual.
Link against stdc++compat.cpp containing back-compat hacks from Mozilla. You can also take a look at my modified version which doesn't depend on any Mozilla headers, but it's slightly out of date.
In particular, this defines a stub __cxa_throw_bad_array_new_length
.
It would be helpful if you post the error message in English.
It appears that the undefined symbol is __cxa_throw_bad_array_new_length
. The functions __cxa
... come from the C++ runtime library. G++ usually ships with it's own version of this library, called libsupc++
. I would guess that the custom-built G++ can not find this library or is emitting a reference to a symbol which is not in the newer (4.9) libsupc++
. Try compiling the libsupc++
source that ships with your custom version of G++ and directing the linker toward it. You may also need to do this for libstdc++
.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With