[Trilinos-Users] Building on mac with clang and c++11

Antonio Cervone ant.cervone at gmail.com
Mon Jun 10 06:54:13 MDT 2013


hi Rob,
i have been using a similar configuration on linux.
i think your problem is unrelated to trilinos.
in order to properly use clang along with libc++, i need to link also
against libc++abi.
you will need something like

elseif ("${CMAKE_CXX_COMPILER_ID}" MATCHES "Clang")
    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -stdlib=libc++" )
    set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -lc++abi" )
else ()

don't know if mac osx requires this too.
cheers

antonio


On Mon, Jun 10, 2013 at 1:27 PM, Robert N. Simpson
<simpsonR4 at cardiff.ac.uk> wrote:
> I'm very new to the user group, so I'm not entirely sure this query is
> appropriate for the email list. I'll give it a shot anyway.
>
> My problem is that I am trying to build a project using on Mac OS X (10.7.5)
> with clang (llvm 4.2) and c++11 while incorporating the Trilinos library. To
> simplify my issue, I tried to compile a simple source file containing basic
> Epetra classes. My CMakeLists.txt file for this project looks like the
> following:
>
> # ----- CMakeLists.txt file --------------
> project( tester )
> cmake_mimimum_required( VERSION 2.8 )
>
> # Initialize CXXFLAGS.
> set(CMAKE_CXX_FLAGS "-Wall -std=c++11")
>
> # Compiler-specific C++11 activation.
> if ("${CMAKE_CXX_COMPILER_ID}" MATCHES "GNU")
>     execute_process(
>         COMMAND ${CMAKE_CXX_COMPILER} -dumpversion OUTPUT_VARIABLE
> GCC_VERSION)
>     if (NOT (GCC_VERSION VERSION_GREATER 4.7 OR GCC_VERSION VERSION_EQUAL
> 4.7))
>         message(FATAL_ERROR "${PROJECT_NAME} requires g++ 4.7 or greater.")
>     endif ()
> elseif ("${CMAKE_CXX_COMPILER_ID}" MATCHES "Clang")
>     set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -stdlib=libc++" )
> else ()
>     message(FATAL_ERROR "Your C++ compiler does not support C++11.")
> endif ()
>
> FIND_PACKAGE( Trilinos )
>
> include_directories(${Trilinos_TPL_INCLUDE_DIRS})
> include_directories(${Trilinos_INCLUDE_DIRS})
>
> link_directories(${Trilinos_LIBRARY_DIRS})
> link_directories(${Trilinos_TPL_LIBRARY_DIRS})
>
> add_executable( tester main.cpp )
>
> target_link_libraries( tester  ${Trilinos_LIBRARIES}
> ${Trilinos_TPL_LIBRARIES} )
> # ---------- end of file ----------
>
> The source file main.cpp compiles ok, but during the linking stage I get
> some errors trying to link with what seems to be the std c++ library. E.g.
> here is the first error:
>
> Undefined symbols for architecture x86_64:
>   "std::string::size() const", referenced from:
>       std::basic_string<char, std::char_traits<char>, std::allocator<char> >
> std::operator+<char, std::char_traits<char>, std::allocator<char> >(char
> const*, std::basic_string<char, std::char_traits<char>, std::allocator<char>
>> const&) in libepetra.a(Epetra_MultiVector.cpp.o)
>       std::basic_string<char, std::char_traits<char>, std::allocator<char> >
> std::operator+<char, std::char_traits<char>, std::allocator<char> >(char
> const*, std::basic_string<char, std::char_traits<char>, std::allocator<char>
>> const&) in libepetra.a(Epetra_BlockMap.cpp.o)
>       std::basic_string<char, std::char_traits<char>, std::allocator<char> >
> std::operator+<char, std::char_traits<char>, std::allocator<char> >(char
> const*, std::basic_string<char, std::char_traits<char>, std::allocator<char>
>> const&) in libepetra.a(Epetra_IntVector.cpp.o)
>       std::basic_string<char, std::char_traits<char>, std::allocator<char> >
> std::operator+<char, std::char_traits<char>, std::allocator<char> >(char
> const*, std::basic_string<char, std::char_traits<char>, std::allocator<char>
>> const&) in libepetra.a(Epetra_IntSerialDenseMatrix.cpp.o)
>       std::basic_string<char, std::char_traits<char>, std::allocator<char> >
> std::operator+<char, std::char_traits<char>, std::allocator<char> >(char
> const*, std::basic_string<char, std::char_traits<char>, std::allocator<char>
>> const&) in libepetra.a(Epetra_CrsGraph.cpp.o)
>       std::basic_string<char, std::char_traits<char>, std::allocator<char> >
> std::operator+<char, std::char_traits<char>, std::allocator<char> >(char
> const*, std::basic_string<char, std::char_traits<char>, std::allocator<char>
>> const&) in libepetra.a(Epetra_SerialDenseMatrix.cpp.o)
>   "std::string::c_str() const", referenced from:
>       Epetra_Object::ReportError(std::string, int) const in
> libepetra.a(Epetra_Object.cpp.o)
>
> I have tried to play around with various settings, such as recompiling the
> Trilinos library with the -std=c++11 and -stdlib=libc++ flags, but with no
> success. Everything works fine on my linux machine with gcc.
>
> Is there a simple way to get around the issues I am facing? Let me know if
> I've left any important diagnostic details out.
>
> Many thanks.
>
> Rob
>
>
>
>
>
>
>
>
>
> _______________________________________________
> Trilinos-Users mailing list
> Trilinos-Users at software.sandia.gov
> http://software.sandia.gov/mailman/listinfo/trilinos-users
>


More information about the Trilinos-Users mailing list