Why clang++37 behaves differently on 9.3 and 10.3?

Matthias Andree matthias.andree at gmx.de
Wed May 18 07:31:23 UTC 2016


Am 12.05.2016 um 19:59 schrieb Dimitry Andric:
> On 12 May 2016, at 13:33, Yuri wrote:
>>
>> clang++37 compiles this simple program fine on 10.3, but fails on 9.3.
>>
>> Why does it behave differently on different OS versions?
>>
>> It looks like it ignores -std=c++11 on 9.3.
> 
> You cannot compile for C++11 on a 9.x installation, because clang will
> use libstdc++ by default there, and the version of libstdc++ in the
> 9.x base system is not C++11 compatible.
> 
> To be able to use C++11, you must install libc++ first, using for
> example:

[...]

> On FreeBSD 10.x, clang and libc++ are the defaults, and C++11 can be
> used out of the box.

[...]

(Not meaning to pollute bugzilla yet, hence by mail -- feel free to
upload whichever portions of this to the PR that you feel like, unless
you contort the context. Everyone be aware of Jan's CPPFLAGS hints in
https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=209467#c5 that
rawtherapee does not currently set explicitly.)

I was wondering... for the rawtherapee build in the ports framework I'm
doing this (shown below), namely, force the port to use *libc++ with
GCC* (I need(ed) to force GCC because clang used to lack OpenMP support,
and I needed to match the C++ standard library to what the base system
provides by default, that's why it is under the COMPILER_FEATURES check).
I think the original idea was from Baptiste Daroussin.

I was wondering if it would work for Yuri as well on 9.3 (where
graphics/rawtherapee would not normally use it because libc++ isn't part
of COMPILER_FEATURES there).  The key will certainly be -nostdinc++ to
get GNU libstdc++ out of the way and the flags to pull the ports libc++ in.

The additional difficulty will be that the third-party requisite C++
libraries, if any,  would likely have to be recompiled the same way.

Mixing and matching GNU libstdc++ and libc++ in the same executable
won't work (because these two libraries only agree on the API more or
less, but neither the ABI nor the internal structure layouts).

<https://svnweb.freebsd.org/ports/head/graphics/rawtherapee/Makefile?view=markup&pathrev=395090#l62>

62 	.if ${COMPILER_FEATURES:Mlibc++}
63 	LDFLAGS+=       -L/usr/local/lib/c++
64 	CXXFLAGS+=      -nostdinc++ -isystem /usr/local/include/c++/v1
65 	CFLAGS+=        -isystem /usr/local/include/c++/v1
66 	BUILD_DEPENDS+=
${LOCALBASE}/lib/c++/libstdc++.so:${PORTSDIR}/devel/libc++
67 	.endif


More information about the freebsd-ports mailing list