icpc 14.0.0 + boost 1.54 causes undefined reference to `__builtin_signbit'

icpc 14.0.0 + boost 1.54 causes undefined reference to `__builtin_signbit'

The following code fails to link when using icpc 14.0.0 and boost 1.54 or 1.53:

#include <boost/lexical_cast.hpp>
#include <string>
int main()
  const float f(0.123f); 
  return 0;

Commmand line:

icpc -std=c++11  -I boost_1_54_0/ icpc_14_builtin_signbit_failure.cpp


/tmp/icpcZV9IvT.o: In function `main':
icpc_14_builtin_signbit_failure.cpp:(.text+0x65): undefined reference to `__builtin_signbit'
icpc_14_builtin_signbit_failure.cpp:(.text+0xa8): undefined reference to `__builtin_signbit'

It compiles fine if -std=c++11 is not specified. It also compiles fine with icpc 13.1.3 and -std=c++11 defined.

I have attached a file with the complete source for reproduction.

This is a showstopper for upgrading to the new compilers.

15 posts / 0 new
Last post
For more complete information about compiler optimizations, see our Optimization Notice.

Thanks for the report, (and the test case!) DPD200295115 is tracking the issue.

Is there any workaround I can employ while we wait for the fix/update? Downgrading my boost to an earlier version is not an option for me.

As a workaround, can you change your source program to use double instead of float?

const double df(0.123f);


Succeed using c++11 string conversion as a workaround. Thanks.

Was this fixed with the new release 14.0.1 ?

>>...icpc_14_builtin_signbit_failure.cpp:(.text+0x65): undefined reference to `__builtin_signbit'
>>...icpc_14_builtin_signbit_failure.cpp:(.text+0xa8): undefined reference to `__builtin_signbit'

I'd like to suggest to try to add cmath header file simply for verification if it could fix the problem since this is how a set of sign functions is defined in the header:
constexpr bool signbit(float __x){ return __builtin_signbit(__x); }
constexpr bool signbit(double __x){ return __builtin_signbit(__x); }
constexpr bool signbit(long double __x){ return __builtin_signbit(__x); }


I have verified that this not work with 14.0.1 either. I tried to include the cmath header both before and after the other headers, but the error is still the same.

The fix isn't available yet. (the compiler issue is that __builtin_signbit is available for double, but not float). Are you able to use the workaround where you change the type from float to double?

const double d(0.123f);


Thanks for the reply. I'm aware of this workaround, but it will require a significant amount of work for an issue that will go away (hopefully soon). I'll wait for a new update before moving to a new version of the compiler.


This bug is still not fixed in 14.0.2.

I can confirm this is still a problem in
Version Build 20140120

undefined reference to `__builtin_signbit' showed up
in the compile of qtwebkit Qt 5.2.1

Luckily the workaround from MathExtras.h for SOLARIS can be
easily applied in this case.

Change the two instances of signbit to copysign
return std::signbit(floatTime) ? negativeInfiniteTime() : positiveInfiniteTime();
return (std::copysign(1.0, floatTime) < 0) ? negativeInfiniteTime() : positiveInfiniteTime();


I'm affected by the same issue, it's also triggered by other boost routines like the floating point classification.

As a workaround, I tried to implement a custom builtin using:

bool sb (float f) asm ("__builtin_signbit");
bool sb (float f) { return f >= 0.0f; }

Which resolves the linker errors, but the function is not called at runtime (incorrect calling convention, maybe?)


This was fixed on 2/7/2014 so it should be fixed in the next 14.0 update. Sorry for the inconvenience.

HI all,

Update 3 is now available and resolves this problem with __builtin_signbit, at least with the test cases I've got.

Leave a Comment

Please sign in to add a comment. Not a member? Join today