[cfe-dev] libcxx error: template with C linkage

Alan Carvalho de Assis via cfe-dev cfe-dev at lists.llvm.org
Mon Nov 7 09:17:03 PST 2016


Hi Everyone,

I'm compiling the LLVM libcxx for NuttX RTOS (compiling on Linux to
integrate it on NuttX).

But it is failing with tons of these "error: template with C linkage" :

make[1]: Entering directory '/home/alan/nuttxspace/nuttx/libxx'
CXX:  libcxx/algorithm.cxx
arm-none-eabi-g++ -c  -Wall -Wshadow -Wundef -g -mcpu=cortex-m4
-mthumb -mfloat-abi=soft -I. -isystem
/home/alan/nuttxspace/nuttx/include -isystem
/home/alan/nuttxspace/nuttx/include/cxx -isystem
/home/alan/nuttxspace/nuttx/include/libcxx   -pipe -std=c++11
-DCLOCK_MONOTONIC -D__NuttX__ -pedantic -D_DEBUG
-D_LIBCPP_BUILD_STATIC  libcxx/algorithm.cxx -o  algorithm.o
In file included from
/home/alan/nuttxspace/nuttx/include/libcxx/algorithm:639:0,
                 from libcxx/algorithm.cxx:10:
/home/alan/nuttxspace/nuttx/include/libcxx/type_traits:397:1: error:
template with C linkage
 template <class _T1, class _T2> struct _LIBCPP_TYPE_VIS_ONLY pair;
 ^
/home/alan/nuttxspace/nuttx/include/libcxx/type_traits:398:1: error:
template with C linkage
 template <class _Tp> class _LIBCPP_TYPE_VIS_ONLY reference_wrapper;
 ^
/home/alan/nuttxspace/nuttx/include/libcxx/type_traits:399:1: error:
template with C linkage
 template <class _Tp> struct _LIBCPP_TYPE_VIS_ONLY hash;
 ^
/home/alan/nuttxspace/nuttx/include/libcxx/type_traits:401:1: error:
template with C linkage
 template <class>
 ^
/home/alan/nuttxspace/nuttx/include/libcxx/type_traits:404:1: error:
template with C linkage
 template <class _Tp>
 ^
/home/alan/nuttxspace/nuttx/include/libcxx/type_traits:407:1: error:
template with C linkage
 template <class _Tp, bool>
 ^
/home/alan/nuttxspace/nuttx/include/libcxx/type_traits:410:1: error:
template with C linkage
 template <bool _Bp, class _If, class _Then>
 ^
/home/alan/nuttxspace/nuttx/include/libcxx/type_traits:412:1: error:
template with C linkage
 template <class _If, class _Then>
 ^
/home/alan/nuttxspace/nuttx/include/libcxx/type_traits:419:1: error:
template with C linkage
 template <bool, class _Tp> struct _LIBCPP_TYPE_VIS_ONLY __lazy_enable_if {};
 ^
/home/alan/nuttxspace/nuttx/include/libcxx/type_traits:420:1: error:
template with C linkage
 template <class _Tp> struct _LIBCPP_TYPE_VIS_ONLY
__lazy_enable_if<true, _Tp> {typedef typename _Tp::type type;};
 ^
/home/alan/nuttxspace/nuttx/include/libcxx/type_traits:422:1: error:
template with C linkage
 template <bool, class _Tp = void> struct _LIBCPP_TYPE_VIS_ONLY enable_if {};




I searched on Internet and discovered that this error happens when
there is some 'extern "C" { ' without the closing ' }' and then it
wrap some C++ code.

I saw this comment inside ctype.h :

#ifdef __cplusplus
#if defined(_LIBCPP_MSVCRT)
// We support including .h headers inside 'extern "C"' contexts, so switch
// back to C++ linkage before including these C++ headers.
extern "C++" {
  #include "support/win32/support.h"
  #include "support/win32/locale_win32.h"
}
#endif // _LIBCPP_MSVCRT

Although I'm not on MSVCRT, the comment explains why this error could happen.

But I used -save-temps to create the algorithm.ii and searched for all
occurrences of 'extern "C" {' inside it and I can confirm there is not
C++ header inside any 'extern C' block.

After many tests I noted that if I modify include/algorithm to include
'extern "C++" {' :
@@ -634,7 +634,10 @@ template <class BidirectionalIterator, class Compare>

 #include <__config>
 #include <initializer_list>
+extern "C++"
+{
 #include <type_traits>
+}
 #include <cstring>
 #include <utility> // needed to provide swap_ranges.
 #include <memory>

The issue disappear, but I want to discover the root caused instead of
use an ugly hack.

How I can discover where the error is happening, since -save-temps
didn't show nothing wrong ?

BR,

Alan



More information about the cfe-dev mailing list