[CMake] [cmake-developers] C++11/C++14 doesn't work in check_cxx_source_compiles

Craig Scott craig.scott at crascit.com
Fri Nov 25 17:23:24 EST 2016


Sorry, I misunderstood. I had a look through the
check_cxx_source_compiles() implementation and it basically forwards
through to a try_compile() call. Looking at the docs for try_compile()
<file:///Applications/CMake.app/Contents/doc/cmake/html/command/try_compile.html#other-behavior-settings>,
it says only the following are passed through to the temporary CMake
project created for the test compilation:


   - CMAKE_ENABLE_EXPORTS
   - CMAKE_LINK_SEARCH_START_STATIC
   - CMAKE_LINK_SEARCH_END_STATIC
   - CMAKE_POSITION_INDEPENDENT_CODE

A few more can be passed through depending on policy settings, but it looks
like CMAKE_CXX_STANDARD, CMAKE_CXX_STANDARD_REQUIRED and
CMAKE_CXX_EXTENSIONS don't get passed through. So it looks like, at the
moment, you would have to manually pass through the relevant compiler and
linker flags to get sources built via try_compile() and therefore via
check_cxx_source_compiles(). I've recorded a new issue
<https://gitlab.kitware.com/cmake/cmake/issues/16456> in the issue tracker
for this.





On Fri, Nov 25, 2016 at 9:25 PM, Roman Wüger <roman.wueger at gmx.at> wrote:

> but it does not set/add the required library
>
> Am 24.11.2016 um 22:01 schrieb Craig Scott <craig.scott at crascit.com>:
>
> You might also need to set CMAKE_CXX_EXTENSIONS
> <https://cmake.org/cmake/help/latest/variable/CMAKE_CXX_EXTENSIONS.html>
> to OFF (it's ON by default). This controls which c++ library is linked for
> some compilers, with clang and gcc being two cases where it does this. You
> may also find this article
> <https://crascit.com/2015/03/28/enabling-cxx11-in-cmake/> about the
> related CMake variables and commands to be of interest.
>
> On Fri, Nov 25, 2016 at 5:43 AM, Roman Wüger <roman.wueger at gmx.at> wrote:
>
>> It is working now, after I added -lc++ to CMAKE_REQUIRED_LIBRARIES before
>> the check_cxx_source_compiles() call.
>>
>> Shouldn't this be done by CMAKE_CXX_STANDARD?
>>
>> Best Regards
>> Roman
>>
>> Am 24.11.2016 um 19:08 schrieb Roman Wüger <roman.wueger at gmx.at>:
>>
>> Hello,
>>
>>
>>
>> If I use a small piece of code which uses <regex>, then it fails with
>> check_cxx_source_compiles. If I copy the piece of code into a file and run
>> the following on the command line, then it works:
>>
>>
>>
>> clang++ main.cpp -std=c++14 -stdlib=libc++
>>
>>
>>
>> Here is the piece of code:
>>
>>
>>
>> #include <regex>
>>
>> #include <string>
>>
>>
>>
>> int main() {
>>
>>     const std::string text = "Roses are #ff0000, other flowers have other
>> colors.";
>>
>>     const std::regex pattern("#([a-f0-9]{2})");
>>
>>
>>
>>     std::smatch match;
>>
>>     std::regex_search(text, match, pattern);
>>
>>
>>
>>     return 0;
>>
>> }
>>
>>
>>
>> I use this code in CMake as a platform check as followed:
>>
>>
>>
>> # C++11 Regular Expression
>>
>> set(CMAKE_REQUIRED_FLAGS "${CMAKE_CXX_FLAGS}")
>>
>> check_cxx_source_compiles(
>>
>>   "#include <regex>
>>
>>    #include <string>
>>
>>
>>
>>    int main() {
>>
>>        const std::string text = \"Roses are #ff0000, other flowers have
>> other colors.\";
>>
>>        const std::regex pattern(\"#([a-f0-9]{2})\");
>>
>>
>>
>>        std::smatch match;
>>
>>        std::regex_search(text, match, pattern);
>>
>>
>>
>>        return 0;
>>
>>    }"
>>
>>   HAVE_CXX11_REGULAR_EXPRESSIONS
>>
>> )
>>
>> set(CMAKE_REQUIRED_FLAGS "")
>>
>>
>>
>> CMakeFiles/CMakeError.log shows:
>>
>>
>>
>> Undefined symbols for architecture x86_64:
>>
>>   "std::__1::basic_string<char, std::__1::char_traits<char>,
>> std::__1::allocator<char> >::compare(char const*) const", referenced from:
>>
>>       std::__1::basic_regex<char, std::__1::regex_traits<char>
>> >::__start_matching_list(bool) in src.o
>>
>>   "std::__1::__vector_base_common<true>::__throw_length_error() const",
>> referenced from:
>>
>>       std::__1::vector<std::__1::sub_match<char const*>,
>> std::__1::allocator<std::__1::sub_match<char const*> >
>> >::assign(unsigned long, std::__1::sub_match<char const*> const&) in src.o
>>
>>       std::__1::vector<std::__1::sub_match<char const*>,
>> std::__1::allocator<std::__1::sub_match<char const*> >
>> >::allocate(unsigned long) in src.o
>>
>>       void std::__1::vector<std::__1::__state<char>,
>> std::__1::allocator<std::__1::__state<char> >
>> >::__push_back_slow_path<std::__1::__state<char>
>> >(std::__1::__state<char>&&) in src.o
>>
>>       std::__1::vector<std::__1::sub_match<char const*>,
>> std::__1::allocator<std::__1::sub_match<char const*> >
>> >::__append(unsigned long, std::__1::sub_match<char const*> const&) in src.o
>>
>>       std::__1::vector<std::__1::pair<unsigned long, char const*>,
>> std::__1::allocator<std::__1::pair<unsigned long, char const*> >
>> >::__append(unsigned long) in src.o
>>
>>       std::__1::vector<std::__1::pair<unsigned long, char const*>,
>> std::__1::allocator<std::__1::pair<unsigned long, char const*> >
>> >::allocate(unsigned long) in src.o
>>
>>       void std::__1::vector<char, std::__1::allocator<char>
>> >::__push_back_slow_path<char>(char&&) in src.o
>>
>>       ...
>>
>>   "std::__1::__basic_string_common<true>::__throw_length_error() const",
>> referenced from:
>>
>>       std::__1::enable_if<__is_forward_iterator<char*>::value,
>> void>::type std::__1::basic_string<char, std::__1::char_traits<char>,
>> std::__1::allocator<char> >::__init<char*>(char*, char*) in src.o
>>
>>       std::__1::enable_if<__is_forward_iterator<char const*>::value,
>> void>::type std::__1::basic_string<char, std::__1::char_traits<char>,
>> std::__1::allocator<char> >::__init<char const*>(char const*, char const*)
>> in src.o
>>
>>       std::__1::enable_if<__is_forward_iterator<std::__1::__wrap_iter<char*>
>> >::value, void>::type std::__1::basic_string<char,
>> std::__1::char_traits<char>, std::__1::allocator<char>
>> >::__init<std::__1::__wrap_iter<char*> >(std::__1::__wrap_iter<char*>,
>> std::__1::__wrap_iter<char*>) in src.o
>>
>>   "std::__1::__match_any_but_newline<char>::__exec(std::__1::__state<char>&)
>> const", referenced from:
>>
>>       vtable for std::__1::__match_any_but_newline<char> in src.o
>>
>>   "std::__1::locale::name() const", referenced from:
>>
>>       std::__1::basic_regex<char, std::__1::regex_traits<char>
>> >::__start_matching_list(bool) in src.o
>>
>>   "std::__1::locale::use_facet(std::__1::locale::id&) const", referenced
>> from:
>>
>>       std::__1::regex_traits<char>::__init() in src.o
>>
>>   "std::__1::regex_error::regex_error(std::__1::regex_constants::error_type)",
>> referenced from:
>>
>>       char const* std::__1::basic_regex<char,
>> std::__1::regex_traits<char> >::__parse<char const*>(char const*, char
>> const*) in src.o
>>
>>       char const* std::__1::basic_regex<char,
>> std::__1::regex_traits<char> >::__parse_basic_reg_exp<char const*>(char
>> const*, char const*) in src.o
>>
>>       char const* std::__1::basic_regex<char,
>> std::__1::regex_traits<char> >::__parse_extended_reg_exp<char
>> const*>(char const*, char const*) in src.o
>>
>>       char const* std::__1::basic_regex<char,
>> std::__1::regex_traits<char> >::__parse_assertion<char const*>(char const*,
>> char const*) in src.o
>>
>>       char const* std::__1::basic_regex<char,
>> std::__1::regex_traits<char> >::__parse_atom<char const*>(char const*, char
>> const*) in src.o
>>
>>       char const* std::__1::basic_regex<char,
>> std::__1::regex_traits<char> >::__parse_ERE_dupl_symbol<char
>> const*>(char const*, char const*, std::__1::__owns_one_state<char>*,
>> unsigned int, unsigned int) in src.o
>>
>>       bool std::__1::basic_regex<char, std::__1::regex_traits<char>
>> >::__match_at_start_ecma<std::__1::allocator<std::__1::sub_match<char
>> const*> > >(char const*, char const*, std::__1::match_results<char const*,
>> std::__1::allocator<std::__1::sub_match<char const*> > >&,
>> std::__1::regex_constants::match_flag_type, bool) const in src.o
>>
>>       ...
>>
>>   "std::__1::regex_error::~regex_error()", referenced from:
>>
>>       char const* std::__1::basic_regex<char,
>> std::__1::regex_traits<char> >::__parse<char const*>(char const*, char
>> const*) in src.o
>>
>>       char const* std::__1::basic_regex<char,
>> std::__1::regex_traits<char> >::__parse_basic_reg_exp<char const*>(char
>> const*, char const*) in src.o
>>
>>       char const* std::__1::basic_regex<char,
>> std::__1::regex_traits<char> >::__parse_extended_reg_exp<char
>> const*>(char const*, char const*) in src.o
>>
>>       char const* std::__1::basic_regex<char,
>> std::__1::regex_traits<char> >::__parse_assertion<char const*>(char const*,
>> char const*) in src.o
>>
>>       char const* std::__1::basic_regex<char,
>> std::__1::regex_traits<char> >::__parse_atom<char const*>(char const*, char
>> const*) in src.o
>>
>>       char const* std::__1::basic_regex<char,
>> std::__1::regex_traits<char> >::__parse_ERE_dupl_symbol<char
>> const*>(char const*, char const*, std::__1::__owns_one_state<char>*,
>> unsigned int, unsigned int) in src.o
>>
>>       bool std::__1::basic_regex<char, std::__1::regex_traits<char>
>> >::__match_at_start_ecma<std::__1::allocator<std::__1::sub_match<char
>> const*> > >(char const*, char const*, std::__1::match_results<char const*,
>> std::__1::allocator<std::__1::sub_match<char const*> > >&,
>> std::__1::regex_constants::match_flag_type, bool) const in src.o
>>
>>       ...
>>
>>   "std::__1::basic_string<char, std::__1::char_traits<char>,
>> std::__1::allocator<char> >::__init(char const*, unsigned long)",
>> referenced from:
>>
>>       _main in src.o
>>
>>   "std::__1::basic_string<char, std::__1::char_traits<char>,
>> std::__1::allocator<char> >::__init(unsigned long, char)", referenced from:
>>
>>       std::__1::__bracket_expression<char, std::__1::regex_traits<char>
>> >::__exec(std::__1::__state<char>&) const in src.o
>>
>>   "std::__1::basic_string<char, std::__1::char_traits<char>,
>> std::__1::allocator<char> >::reserve(unsigned long)", referenced from:
>>
>>       std::__1::basic_string<char, std::__1::char_traits<char>,
>> std::__1::allocator<char> > std::__1::regex_traits<char>::
>> __lookup_collatename<char*>(char*, char*, char) const in src.o
>>
>>       char const* std::__1::basic_regex<char,
>> std::__1::regex_traits<char> >::__parse_collating_symbol<char
>> const*>(char const*, char const*, std::__1::basic_string<char,
>> std::__1::char_traits<char>, std::__1::allocator<char> >&) in src.o
>>
>>       std::__1::basic_string<char, std::__1::char_traits<char>,
>> std::__1::allocator<char> > std::__1::regex_traits<char>::__lookup_collatename<char
>> const*>(char const*, char const*, char) const in src.o
>>
>>   "std::__1::basic_string<char, std::__1::char_traits<char>,
>> std::__1::allocator<char> >::basic_string(std::__1::basic_string<char,
>> std::__1::char_traits<char>, std::__1::allocator<char> > const&)",
>> referenced from:
>>
>>       char const* std::__1::basic_regex<char,
>> std::__1::regex_traits<char> >::__parse_equivalence_class<char
>> const*>(char const*, char const*, std::__1::__bracket_expression<char,
>> std::__1::regex_traits<char> >*) in src.o
>>
>>       void std::__1::vector<std::__1::basic_string<char,
>> std::__1::char_traits<char>, std::__1::allocator<char> >,
>> std::__1::allocator<std::__1::basic_string<char,
>> std::__1::char_traits<char>, std::__1::allocator<char> > >
>> >::__push_back_slow_path<std::__1::basic_string<char,
>> std::__1::char_traits<char>, std::__1::allocator<char> >
>> const&>(std::__1::basic_string<char, std::__1::char_traits<char>,
>> std::__1::allocator<char> > const&&&) in src.o
>>
>>   "std::__1::basic_string<char, std::__1::char_traits<char>,
>> std::__1::allocator<char> >::~basic_string()", referenced from:
>>
>>       _main in src.o
>>
>>       std::__1::basic_regex<char, std::__1::regex_traits<char>
>> >::__start_matching_list(bool) in src.o
>>
>>       std::__1::__bracket_expression<char, std::__1::regex_traits<char>
>> >::__exec(std::__1::__state<char>&) const in src.o
>>
>>       std::__1::__vector_base<std::__1::basic_string<char,
>> std::__1::char_traits<char>, std::__1::allocator<char> >,
>> std::__1::allocator<std::__1::basic_string<char,
>> std::__1::char_traits<char>, std::__1::allocator<char> > >
>> >::~__vector_base() in src.o
>>
>>       std::__1::pair<std::__1::basic_string<char,
>> std::__1::char_traits<char>, std::__1::allocator<char> >,
>> std::__1::basic_string<char, std::__1::char_traits<char>,
>> std::__1::allocator<char> > >::~pair() in src.o
>>
>>       std::__1::basic_string<char, std::__1::char_traits<char>,
>> std::__1::allocator<char> > std::__1::regex_traits<char>::transform<char*>(char*,
>> char*) const in src.o
>>
>>       std::__1::basic_string<char, std::__1::char_traits<char>,
>> std::__1::allocator<char> > std::__1::regex_traits<char>::
>> __lookup_collatename<char*>(char*, char*, char) const in src.o
>>
>>       ...
>>
>>   "std::__1::basic_string<char, std::__1::char_traits<char>,
>> std::__1::allocator<char> >::operator=(std::__1::basic_string<char,
>> std::__1::char_traits<char>, std::__1::allocator<char> > const&)",
>> referenced from:
>>
>>       std::__1::basic_string<char, std::__1::char_traits<char>,
>> std::__1::allocator<char> > std::__1::regex_traits<char>::
>> __lookup_collatename<char*>(char*, char*, char) const in src.o
>>
>>       std::__1::basic_string<char, std::__1::char_traits<char>,
>> std::__1::allocator<char> > std::__1::regex_traits<char>::__lookup_collatename<char
>> const*>(char const*, char const*, char) const in src.o
>>
>>   "std::__1::basic_string<char, std::__1::char_traits<char>,
>> std::__1::allocator<char> >::operator=(char)", referenced from:
>>
>>       char const* std::__1::basic_regex<char,
>> std::__1::regex_traits<char> >::__parse_character_escape<char
>> const*>(char const*, char const*, std::__1::basic_string<char,
>> std::__1::char_traits<char>, std::__1::allocator<char> >*) in src.o
>>
>>       char const* std::__1::basic_regex<char,
>> std::__1::regex_traits<char> >::__parse_expression_term<char
>> const*>(char const*, char const*, std::__1::__bracket_expression<char,
>> std::__1::regex_traits<char> >*) in src.o
>>
>>       char const* std::__1::basic_regex<char,
>> std::__1::regex_traits<char> >::__parse_class_escape<char const*>(char
>> const*, char const*, std::__1::basic_string<char,
>> std::__1::char_traits<char>, std::__1::allocator<char> >&,
>> std::__1::__bracket_expression<char, std::__1::regex_traits<char> >*) in
>> src.o
>>
>>       char const* std::__1::basic_regex<char,
>> std::__1::regex_traits<char> >::__parse_awk_escape<char const*>(char
>> const*, char const*, std::__1::basic_string<char,
>> std::__1::char_traits<char>, std::__1::allocator<char> >*) in src.o
>>
>>   "std::__1::__get_classname(char const*, bool)", referenced from:
>>
>>       unsigned int std::__1::regex_traits<char>::__lookup_classname<char
>> const*>(char const*, char const*, bool, char) const in src.o
>>
>>   "std::__1::__shared_weak_count::__add_shared()", referenced from:
>>
>>       std::__1::basic_regex<char, std::__1::regex_traits<char>
>> >::basic_regex(std::__1::basic_regex<char, std::__1::regex_traits<char>
>> > const&) in src.o
>>
>>   "std::__1::__shared_weak_count::__release_shared()", referenced from:
>>
>>       std::__1::shared_ptr<std::__1::__empty_state<char>
>> >::~shared_ptr() in src.o
>>
>>   "std::__1::__shared_weak_count::~__shared_weak_count()", referenced
>> from:
>>
>>       std::__1::__shared_ptr_pointer<std::__1::__empty_state<char>*,
>> std::__1::default_delete<std::__1::__empty_state<char> >,
>> std::__1::allocator<std::__1::__empty_state<char> >
>> >::~__shared_ptr_pointer() in src.o
>>
>>   "std::__1::__get_collation_name(char const*)", referenced from:
>>
>>       std::__1::basic_string<char, std::__1::char_traits<char>,
>> std::__1::allocator<char> > std::__1::regex_traits<char>::
>> __lookup_collatename<char*>(char*, char*, char) const in src.o
>>
>>       std::__1::basic_string<char, std::__1::char_traits<char>,
>> std::__1::allocator<char> > std::__1::regex_traits<char>::__lookup_collatename<char
>> const*>(char const*, char const*, char) const in src.o
>>
>>   "std::__1::ctype<char>::id", referenced from:
>>
>>       std::__1::regex_traits<char>::__init() in src.o
>>
>>   "std::__1::locale::locale(std::__1::locale const&)", referenced from:
>>
>>       std::__1::regex_traits<char>::regex_traits(std::__1::regex_traits<char>
>> const&) in src.o
>>
>>       std::__1::basic_regex<char, std::__1::regex_traits<char>
>> >::__start_matching_list(bool) in src.o
>>
>>   "std::__1::locale::locale()", referenced from:
>>
>>       std::__1::regex_traits<char>::regex_traits() in src.o
>>
>>  "std::__1::locale::~locale()", referenced from:
>>
>>       std::__1::regex_traits<char>::~regex_traits() in src.o
>>
>>       std::__1::regex_traits<char>::regex_traits() in src.o
>>
>>       std::__1::basic_regex<char, std::__1::regex_traits<char>
>> >::__start_matching_list(bool) in src.o
>>
>>   "std::__1::collate<char>::id", referenced from:
>>
>>       std::__1::regex_traits<char>::__init() in src.o
>>
>>   "typeinfo for std::__1::regex_error", referenced from:
>>
>>       char const* std::__1::basic_regex<char,
>> std::__1::regex_traits<char> >::__parse<char const*>(char const*, char
>> const*) in src.o
>>
>>       char const* std::__1::basic_regex<char,
>> std::__1::regex_traits<char> >::__parse_basic_reg_exp<char const*>(char
>> const*, char const*) in src.o
>>
>>       char const* std::__1::basic_regex<char,
>> std::__1::regex_traits<char> >::__parse_extended_reg_exp<char
>> const*>(char const*, char const*) in src.o
>>
>>       char const* std::__1::basic_regex<char,
>> std::__1::regex_traits<char> >::__parse_assertion<char const*>(char const*,
>> char const*) in src.o
>>
>>       char const* std::__1::basic_regex<char,
>> std::__1::regex_traits<char> >::__parse_atom<char const*>(char const*, char
>> const*) in src.o
>>
>>       char const* std::__1::basic_regex<char,
>> std::__1::regex_traits<char> >::__parse_ERE_dupl_symbol<char
>> const*>(char const*, char const*, std::__1::__owns_one_state<char>*,
>> unsigned int, unsigned int) in src.o
>>
>>       bool std::__1::basic_regex<char, std::__1::regex_traits<char>
>> >::__match_at_start_ecma<std::__1::allocator<std::__1::sub_match<char
>> const*> > >(char const*, char const*, std::__1::match_results<char const*,
>> std::__1::allocator<std::__1::sub_match<char const*> > >&,
>> std::__1::regex_constants::match_flag_type, bool) const in src.o
>>
>>       ...
>>
>>   "typeinfo for std::__1::__shared_weak_count", referenced from:
>>
>>       typeinfo for std::__1::__shared_ptr_pointer
>> <std::__1::__empty_state<char>*, std::__1::default_delete<std::__1::__empty_state<char>
>> >, std::__1::allocator<std::__1::__empty_state<char> > > in src.o
>>
>>   "vtable for std::__1::__shared_count", referenced from:
>>
>>       std::__1::shared_ptr<std::__1::__empty_state<char>
>> >::shared_ptr<std::__1::__empty_state<char>
>> >(std::__1::__empty_state<char>*, std::__1::enable_if<is_convert
>> ible<std::__1::__empty_state<char>*, std::__1::__empty_state<char>*>::value,
>> std::__1::shared_ptr<std::__1::__empty_state<char> >::__nat>::type) in
>> src.o
>>
>>   NOTE: a missing vtable usually means the first non-inline virtual
>> member function has no definition.
>>
>>   "vtable for std::__1::__shared_weak_count", referenced from:
>>
>>       std::__1::shared_ptr<std::__1::__empty_state<char>
>> >::shared_ptr<std::__1::__empty_state<char>
>> >(std::__1::__empty_state<char>*, std::__1::enable_if<is_convert
>> ible<std::__1::__empty_state<char>*, std::__1::__empty_state<char>*>::value,
>> std::__1::shared_ptr<std::__1::__empty_state<char> >::__nat>::type) in
>> src.o
>>
>>   NOTE: a missing vtable usually means the first non-inline virtual
>> member function has no definition.
>>
>> ld: symbol(s) not found for architecture x86_64
>>
>> clang: error: linker command failed with exit code 1 (use -v to see
>> invocation)
>>
>>
>>
>> ** BUILD FAILED **
>>
>>
>>
>> Did I forget something?
>>
>>
>>
>> Thanks in advance
>>
>>
>>
>> Best Regards
>>
>> Roman
>>
>> --
>>
>> Powered by www.kitware.com
>>
>> Please keep messages on-topic and check the CMake FAQ at:
>> http://www.cmake.org/Wiki/CMake_FAQ
>>
>> Kitware offers various services to support the CMake community. For more
>> information on each offering, please visit:
>>
>> CMake Support: http://cmake.org/cmake/help/support.html
>> CMake Consulting: http://cmake.org/cmake/help/consulting.html
>> CMake Training Courses: http://cmake.org/cmake/help/training.html
>>
>> Visit other Kitware open-source projects at
>> http://www.kitware.com/opensource/opensource.html
>>
>> Follow this link to subscribe/unsubscribe:
>> http://public.kitware.com/mailman/listinfo/cmake-developers
>>
>>
>> --
>>
>> Powered by www.kitware.com
>>
>> Please keep messages on-topic and check the CMake FAQ at:
>> http://www.cmake.org/Wiki/CMake_FAQ
>>
>> Kitware offers various services to support the CMake community. For more
>> information on each offering, please visit:
>>
>> CMake Support: http://cmake.org/cmake/help/support.html
>> CMake Consulting: http://cmake.org/cmake/help/consulting.html
>> CMake Training Courses: http://cmake.org/cmake/help/training.html
>>
>> Visit other Kitware open-source projects at
>> http://www.kitware.com/opensource/opensource.html
>>
>> Follow this link to subscribe/unsubscribe:
>> http://public.kitware.com/mailman/listinfo/cmake-developers
>>
>
>
>
> --
> Craig Scott
> Melbourne, Australia
> https://crascit.com
>
>


-- 
Craig Scott
Melbourne, Australia
https://crascit.com
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://public.kitware.com/pipermail/cmake/attachments/20161126/ede8cf9c/attachment-0001.html>


More information about the CMake mailing list