9

xcode に付属する新しいバージョンの Clang で C++11 機能の一部を使用できるように、Mountain Lion にアップグレードしました。Homebrew の cmake 2.8.9 を使用しています。

C++11 のコンパイラ フラグを追加する非常に単純な CMake プロジェクトを作成しました。

# CMakeLists.txt
cmake_minimum_required(VERSION 2.8)
add_executable(test test.cxx)
add_definitions(-std=c++0x -stdlib=libc++)

test.cxx の C++ コードは次のとおりです。

#include <iostream>

int main()
{
  std::cout << "Howdy" << std::endl;
  return 0;
}

cmake と make を実行すると、ファイルは正常にコンパイルされますが、リンカーは次のエラーを出力します。

Linking CXX executable test
Undefined symbols for architecture x86_64:
  "std::__1::locale::use_facet(std::__1::locale::id&) const", referenced from:
      std::__1::basic_ostream<char, std::__1::char_traits<char> >& std::__1::endl<char, std::__1::char_traits<char> >(std::__1::basic_ostream<char, std::__1::char_traits<char> >&) in test.cxx.o
  "std::__1::ios_base::getloc() const", referenced from:
      std::__1::basic_ostream<char, std::__1::char_traits<char> >& std::__1::endl<char, std::__1::char_traits<char> >(std::__1::basic_ostream<char, std::__1::char_traits<char> >&) in test.cxx.o
  "std::__1::basic_ostream<char, std::__1::char_traits<char> >::put(char)", referenced from:
      std::__1::basic_ostream<char, std::__1::char_traits<char> >& std::__1::endl<char, std::__1::char_traits<char> >(std::__1::basic_ostream<char, std::__1::char_traits<char> >&) in test.cxx.o
  "std::__1::basic_ostream<char, std::__1::char_traits<char> >::flush()", referenced from:
      std::__1::basic_ostream<char, std::__1::char_traits<char> >& std::__1::endl<char, std::__1::char_traits<char> >(std::__1::basic_ostream<char, std::__1::char_traits<char> >&) in test.cxx.o
  "std::__1::basic_ostream<char, std::__1::char_traits<char> >::sentry::sentry(std::__1::basic_ostream<char, std::__1::char_traits<char> >&)", referenced from:
      std::__1::basic_ostream<char, std::__1::char_traits<char> >& std::__1::operator<<<std::__1::char_traits<char> >(std::__1::basic_ostream<char, std::__1::char_traits<char> >&, char const*) in test.cxx.o
  "std::__1::basic_ostream<char, std::__1::char_traits<char> >::sentry::~sentry()", referenced from:
      std::__1::basic_ostream<char, std::__1::char_traits<char> >& std::__1::operator<<<std::__1::char_traits<char> >(std::__1::basic_ostream<char, std::__1::char_traits<char> >&, char const*) in test.cxx.o
  "std::__1::cout", referenced from:
      _main in test.cxx.o
  "std::__1::ctype<char>::id", referenced from:
      std::__1::basic_ostream<char, std::__1::char_traits<char> >& std::__1::endl<char, std::__1::char_traits<char> >(std::__1::basic_ostream<char, std::__1::char_traits<char> >&) in test.cxx.o
  "std::__1::locale::~locale()", referenced from:
      std::__1::basic_ostream<char, std::__1::char_traits<char> >& std::__1::endl<char, std::__1::char_traits<char> >(std::__1::basic_ostream<char, std::__1::char_traits<char> >&) in test.cxx.o
  "std::__1::ios_base::__set_badbit_and_consider_rethrow()", referenced from:
      std::__1::basic_ostream<char, std::__1::char_traits<char> >& std::__1::operator<<<std::__1::char_traits<char> >(std::__1::basic_ostream<char, std::__1::char_traits<char> >&, char const*) in test.cxx.o
  "std::__1::ios_base::clear(unsigned int)", referenced from:
      std::__1::basic_ostream<char, std::__1::char_traits<char> >& std::__1::operator<<<std::__1::char_traits<char> >(std::__1::basic_ostream<char, std::__1::char_traits<char> >&, char const*) in test.cxx.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
make[2]: *** [test] Error 1
make[1]: *** [CMakeFiles/test.dir/all] Error 2
make: *** [all] Error 2

CMakeLists.txt ファイルの add_definitions 行をコメント アウトしてもエラーは発生しません。また、test.cxx の std::cout 行を削除するとエラーを回避できます。おそらく最も奇妙な部分は、単純に実行すると

clang++ -std=c++0x -stdlib=libc++ test.cxx

それはうまくコンパイルされます!そこで、コメンターのアドバイスに従って、コンパイルとリンクのために cmake が実行している実際のコマンドを確認しました。

コンパイル:

/usr/bin/c++    -std=c++0x -stdlib=libc++ -o CMakeFiles/test.dir/test.cxx.o -c /Users/luis/test.cxx

リンク:

/usr/bin/c++    -Wl,-search_paths_first -Wl,-headerpad_max_install_names   CMakeFiles/test.dir/test.cxx.o  -o test

現在の主な問題は、リンカーが適切な C++11 フラグを提供していないことです。コンパイラとリンカの両方がそれらを使用するように、これらのフラグを提供するより良い方法はありますか?

4

5 に答える 5

12

ADD_DEFINITIONSそれがこの特定の仕事に適したツールかどうかはわかりません。

おそらく、より良いオプションは、の値をCMAKE_CXX_FLAGS直接設定することです。

cmake_minimum_required(VERSION 2.8)
set (CMAKE_CXX_FLAGS "-std=c++0x -stdlib=libc++ -g3 -Wall -O0")
add_executable(test test.cxx)
于 2012-09-11T04:10:57.163 に答える
8

gccではなく、実行中にこのエラーが発生しましたg++。を使用するg++と、正しくコンパイルされます。おそらく、Makefile が間違ったコンパイラ フロント エンドを使用している可能性があります。

于 2014-04-30T18:43:28.640 に答える
6

プロジェクトターゲットに移動->AppleLLVMコンパイラ4.1-言語->c++libraryを選択して

libc__(LLVM C++ stadard library with c++ 11 support);
于 2013-02-04T14:24:35.840 に答える
1

最近 (Clang を使用して) このエラーが発生した後、問題は-std=c++11 -stdlib=libc++リンカー フラグとしても渡されないことにありました。

そのため、コンパイラ フラグとリンカー フラグの両方として渡す必要があります。

GCC の場合、最初のフラグは-std=c++0xではなく です-std=c++11

于 2016-03-15T16:46:40.140 に答える
1

私にとっての答えは、clang++代わりに単に使用することでしclangた。

于 2016-04-09T20:33:31.380 に答える