web-dev-qa-db-ja.com

演算子newへの未定義の参照

Cpputestを使用して、単純な単体テストの実行可能ファイルを構築しようとしています。私はcpputestフレームワークを静的ライブラリに組み込み、それを実行可能ファイルにリンクしようとしています。ただし、関連するコードが原因で、私はかなり複雑なMakefileセットアップに縛られています。

これは私のコマンドラインです:

/usr/bin/qcc -V4.2.4,gcc_ntoarmle_acpp-ne -lang-c++ -O2 -g -g -o Application/UnitTests/Tests/symbols/UnitTestExe -Wl,--start-group Application/UnitTests/Tests/../.objs/main.o Application/UnitTests/lib/libcpputest.a -Wl,--end-group -lm 

次のような多くのエラーが発生します。

 Application/UnitTests/lib/libcpputest.a(CommandLineTestRunner.o): In function `CommandLineTestRunner::parseArguments(TestPlugin*)':
   Application/UnitTests/cpputest/src/CppUTest/.objs/../CommandLineTestRunner.cpp:114: undefined reference to `operator new(unsigned int, char const*, int)'

何が原因なのかわかりません。 C++を使って無料で新しいオペレーターを取得しませんか?

24
mbyrne215

あなたの質問には作業するための情報がほとんどありませんが、一部のコードはplacement newの形式を使用しているようですが、その特別なoperator new isdeclared(コンパイラがそれを見つけて、それを使用してコードをコンパイルします)、リンカは定義が見つかりません。

(私の古い答えはまだ注目されているようですので、宣言と定義の詳細については ここ を参照してください。)

8
sbi

おそらく、C++サポートランタイムライブラリとリンクする必要があります。これは、g ++を呼び出すと自動的に行われます。 Linuxでは、これはリンカーに-lstdc ++フラグを追加することで実現されます。あなたはあなたのプラットフォームで同じことをする方法を理解する必要があります。

64
zvrba

ライブラリを含め、コードを最初から再構築する必要があります。このエラーが発生したのは、別のマシンでコンパイルされたオブジェクトファイルを(残りのソースとともに)自分のマシンに誤ってコピーしたためです。ネイティブ(変更されたソースファイル用)と非ネイティブ(その他すべて)の2種類のオブジェクトファイルが存在するため、これはリンク手順を妨げる可能性があります。私はここで推測していますが、「新しい」という演算子は、アーキテクチャが異なると少し異なることを意味するため、このエラーが発生します。

pSこれは有用な回答には遅すぎることはわかっていますが、これを記録するためにまだ投稿しています。

4
BavidDowman

たぶん、C++コンパイラであるg++ではなく、Cコンパイラであるgccを呼び出しているでしょう。

3
Shakaron

QNX 6.5.0の場合、エラーを回避するためにqccgcc)にフラグ-lang-c++を指定しました。

0
Maxim Suslov