[cmake-developers] CXX_STANDARD and linking
Stephen Kelly
steveire at gmail.com
Wed Oct 7 15:09:42 EDT 2015
Brad King wrote:
> On 10/04/2015 10:47 AM, Stephen Kelly wrote:
>> So, is this thread really about a bug, or is it a feature request?
>
> I think it has become a feature request to select link flags for language
> standard levels.
Not the language standard level, but the standard library to compile with
and link with.
It just happens that the way to link to the correct library on SolarisStudio
is -std=c++11 (or -std=c++03 which presumably also links to the same
libstdc++.so shipped with SolarisStudio; but I just note this for
completeness). Also, I agree that we should pass -std=c++11 when linking
with GNU too, which is why it looks like 'language standard level', but it
is not because the language has no relevance at link time.
>> Perhaps those commits should be reverted. I see no reason for
>> SolarisStudio on linux to behave any differently than on solaris, so the
>> commit relating to that is probably not appropriate.
>
> I don't want CMake to generate broken builds by default. We *know* it
> goes wrong on Solaris and cannot possibly work without user intervention.
> If a problem comes up on Linux too we can deal with it as necessary.
I'm pretty sure the situation on linux is the same as on Solaris.
Stephen Kelly wrote:
> It is possible that I was operating as if the link flags were user
> responsibility and had configured my environment accordingly (though I
> don't remember).
>> I wrote here some ideas of a design for specifying the standard library
>> to use:
>>
>>
http://thread.gmane.org/gmane.comp.programming.tools.cmake.devel/13284/focus=13296
>
> Is that the right link? I don't see discussion of -stdlib= in that
> message.
Gmane is not currently resolving the link. You might be right that there is
no mention of -stdlib= flags, but I think there is mention of CMake
providing IMPORTED targets which supply INTERFACE_ properties. I was
referring to the design of cmake providing such IMPORTED targets, and indeed
that design should allow the user to specify the library to link with, and
that should add -stdlib= flags where appropriate.
>> Perhaps, rather than passing CMAKE_CXX11_EXTENSION_COMPILE_OPTION to the
>> linker, we should work more on a design like the above way to specify a
>> standard library.
>
> Yes, but the -std= and -stdlib= flags are different from the full
> LINK_OPTIONS discussion because they are meant specifically for the
> front end and not for the linker (never "-Wl,").
Yes, I think previous design discussion (possibly the one linked above)
included a TOOLCHAIN_OPTIONS property for cases like this and -pthread etc.
> Also they need
> to be selected by CMake rather than propagated as a flag specified
> by project code.
Yes, or some combination of both being possible.
>> The compile features can imply a default and a set of allowed
>> alternatives (for example, compiling with cxx_static_assert implies the
>> use of stdlibc++ or libc++ with Clang by default but there is a way to
>> use the other
>> instead). The COMPATIBLE_INTERFACE features may also be used to ensure
>> that targets which link together all use the same standard library.
>
> Originally I was thinking we should just use the same -std= for linking
> that we do for compilation, but don't we currently support compiling
> different targets at different standard levels and then linking them?
As I wrote, this is not about 'linking with a language standard level',
which is not a concept which has meaning. This is about 'which standard
library binary do we link to?'. In the case of GNU, we link to libstdc++.so.
If we would link some targets to libstdc++ and others to libc++ we could not
use them together because the standard library implementations are not
binary compatibile with each other. See also what I wrote before about
using COMPATIBLE_INTERFACE properties to diagnose this at cmake time.
> BTW, I noticed in cmLocalGenerator::AddCompileOptions that we currently
> mutate the configure step result by setting target properties like
> <LANG>_STANDARD during generation. Also, this is done with one "config"
> value which may not be appropriate in multi-config generators.
Interesting. I've filed a bug here:
http://public.kitware.com/Bug/view.php?id=15773
Thanks,
Steve.
More information about the cmake-developers
mailing list