
こんにちは。
CygwinでC++開発を行っているのですが、C++の関数型マクロであるassert()が使えなくて困っています。
main関数を含むソースファイルに、
#include assert.h
を記述しておけば使えるはずなのですが、そのソースファイルから実行ファイルを、
g++コマンドでビルドしようとすると、以下のようなエラーが出ます。
------------------------------------------------------------
$ g++ test03-STLの使用.cpp
/cygdrive/c/Users/Kei/AppData/Local/Temp/cckwDP4e.o:test03-STLの使用.cpp:(.text+0x904): undefined reference to `___assert_func'
collect2: ld はステータス 1 で終了しました
------------------------------------------------------------
test03-STLの使用.cpp のmain関数は、以下の通りです。
------------------------------------------------------------
int main()
{
string s="ABC DEF\nGH\tIJ";
reverse(s.begin(), s.end() );
assert(s=="JI\tHG\nFED CBA");
cout<<s
return 0;
}
------------------------------------------------------------
ちなみに、実際にインクルードされる
/usr/include/assert.h
の内容は以下のようになっていました。
------------------------------------------------------------
/*
assert.h
*/
#ifdef __cplusplus
extern "C" {
#endif
#include "_ansi.h"
#undef assert
#ifdef NDEBUG /* required by ANSI standard */
# define assert(__e) ((void)0)
#else
# define assert(__e) ((__e) ? (void)0 : __assert_func (__FILE__, __LINE__, \
__ASSERT_FUNC, #__e))
# ifndef __ASSERT_FUNC
/* Use g++'s demangled names in C++. */
# if defined __cplusplus && defined __GNUC__
# define __ASSERT_FUNC __PRETTY_FUNCTION__
/* C99 requires the use of __func__. */
# elif __STDC_VERSION__ >= 199901L
# define __ASSERT_FUNC __func__
/* Older versions of gcc don't have __func__ but can use __FUNCTION__. */
# elif __GNUC__ >= 2
# define __ASSERT_FUNC __FUNCTION__
/* failed to detect __func__ support. */
# else
# define __ASSERT_FUNC ((char *) 0)
# endif
# endif /* !__ASSERT_FUNC */
#endif /* !NDEBUG */
void _EXFUN(__assert, (const char *, int, const char *)
_ATTRIBUTE ((__noreturn__)));
void _EXFUN(__assert_func, (const char *, int, const char *, const char *)
_ATTRIBUTE ((__noreturn__)));
#ifdef __cplusplus
}
#endif
------------------------------------------------------------
Borland C++ Compilerのbcc32コマンドでは、先ほどのソースファイルから実行ファイルをビルドすることができたので、何が問題なのかが分かりません。
以上の件について何かご存知の方がいらっしゃれば、是非教えて頂きたいと思います。
では、よろしくお願い致します。
A 回答 (2件)
- 最新から表示
- 回答順に表示
No.2
- 回答日時:
「完全なソース」も出してもらえませんか?
御回答ありがとうございます。
返信が遅くなって申し訳ございませんでした。
完全なソースは以下の通りです。
#include <iostream>
#include <cassert>
#include <string>
using namespace std;
int main()
{
string s="ABC DEF\nGH\tIJ";
reverse(s.begin(), s.end() );
assert(s=="JI\tHG\nFED CBA");
cout<<s;
return 0;
}
何か分かりましたら、よろしくお願い致します。
No.1
- 回答日時:
リンク時の設定のミスではないかと思うのですが、私にはよくわかりません。
-vオプションを付ければ、ビルド時の色々な設定が出てくるので、それを載せれば誰か分かる人が出てくるかもしれません。
御回答ありがとうございます。
>-vオプションを付ければ、ビルド時の色々な設定が出てくるので、それを載せれば誰か分かる人が出てくるかもしれません。
記載したソースファイルから実行ファイルを、g++コマンドに-vオプションをつけて、ビルドしようとた時の結果は以下の通りです。
------------------------------------------------------------
Kei-Valuestar@Kei: ~/C_and_C++_Programs/Cpp_Programs
$ g++ -v assert.cpp
/bin/../lib/gcc/i686-pc-cygwin/3.4.4/specs から spec を読み込み中
コンフィグオプション: /managed/gcc-build/final-v3-bootstrap/gcc-3.4.4-999/configure --verbose --program-suffix=-3 --prefix=/usr --exec-prefix=/usr --sysconfdir=/etc --libdir=/usr/lib --libexecdir=/usr/lib --mandir=/usr/share/man --infodir=/usr/share/info --enable-languages=c,ada,c++,d,f77,pascal,java,objc --enable-nls --without-included-gettext --enable-version-specific-runtime-libs --without-x --enable-libgcj --disable-java-awt --with-system-zlib --enable-interpreter --disable-libgcj-debug --enable-threads=posix --enable-java-gc=boehm --disable-win32-registry --enable-sjlj-exceptions --enable-hash-synchronization --enable-libstdcxx-debug
スレッドモデル: posix
gcc version 3.4.4 (cygming special, gdc 0.12, using dmd 0.125)
/bin/../lib/gcc/i686-pc-cygwin/3.4.4/cc1plus.exe -quiet -v -iprefix /bin/../lib/gcc/i686-pc-cygwin/3.4.4/ -D__CYGWIN32__ -D__CYGWIN__ -Dunix -D__unix__ -D__unix -idirafter /usr/lib/gcc/i686-pc-cygwin/3.4.4/../../../../include/w32api -idirafter /usr/lib/gcc/i686-pc-cygwin/3.4.4/../../../../i686-pc-cygwin/lib/../../include/w32api assert.cpp -quiet -dumpbase assert.cpp -mtune=pentiumpro -auxbase assert -Wno-deprecated -version -o /cygdrive/c/Users/kei/AppData/Local/Temp/ccNI6mgL.s
存在しないディレクトリ "/bin/../lib/gcc/i686-pc-cygwin/3.4.4/../../../../i686-pc-cygwin/include" を無視します
重複したディレクトリ "/usr/lib/gcc/i686-pc-cygwin/3.4.4/include/c++" を無視します
重複したディレクトリ "/usr/lib/gcc/i686-pc-cygwin/3.4.4/include/c++/i686-pc-cygwin" を無視します
重複したディレクトリ "/usr/lib/gcc/i686-pc-cygwin/3.4.4/include/c++/backward" を無視します
重複したディレクトリ "/usr/lib/gcc/i686-pc-cygwin/3.4.4/include" を無視します
存在しないディレクトリ "/usr/lib/gcc/i686-pc-cygwin/3.4.4/../../../../i686-pc-cygwin/include" を無視します
重複したディレクトリ "/usr/lib/gcc/i686-pc-cygwin/3.4.4/../../../../i686-pc-cygwin/lib/../../include/w32api" を無視します
#include "..." の探索はここから始まります:
#include <...> の探索はここから始まります:
/bin/../lib/gcc/i686-pc-cygwin/3.4.4/include/c++
/bin/../lib/gcc/i686-pc-cygwin/3.4.4/include/c++/i686-pc-cygwin
/bin/../lib/gcc/i686-pc-cygwin/3.4.4/include/c++/backward
/bin/../lib/gcc/i686-pc-cygwin/3.4.4/include
/usr/local/include
/usr/include
/usr/lib/gcc/i686-pc-cygwin/3.4.4/../../../../include/w32api
探索リストの終わり
GNU C++ version 3.4.4 (cygming special, gdc 0.12, using dmd 0.125) (i686-pc-cygwin)
compiled by GNU C version 3.4.4 (cygming special, gdc 0.12, using dmd 0.125).
GGC heuristics: --param ggc-min-expand=100 --param ggc-min-heapsize=131072
/usr/lib/gcc/i686-pc-cygwin/3.4.4/../../../../i686-pc-cygwin/bin/as.exe -o /cygdrive/c/Users/kei/AppData/Local/Temp/cccIcGlN.o /cygdrive/c/Users/kei/AppData/Local/Temp/ccNI6mgL.s
/bin/../lib/gcc/i686-pc-cygwin/3.4.4/collect2.exe -Bdynamic --dll-search-prefix=cyg /bin/../lib/gcc/i686-pc-cygwin/3.4.4/../../../crt0.o -L/bin/../lib/gcc/i686-pc-cygwin/3.4.4 -L/bin/../lib/gcc -L/usr/lib/gcc/i686-pc-cygwin/3.4.4 -L/usr/lib/gcc/i686-pc-cygwin/3.4.4 -L/bin/../lib/gcc/i686-pc-cygwin/3.4.4/../../.. -L/usr/lib/gcc/i686-pc-cygwin/3.4.4/../../.. /cygdrive/c/Users/kei/AppData/Local/Temp/cccIcGlN.o -lstdc++ -lgcc -lcygwin -luser32 -lkernel32 -ladvapi32 -lshell32 -lgcc
/cygdrive/c/Users/kei/AppData/Local/Temp/cccIcGlN.o:assert.cpp:(.text+0x3ad): undefined reference to `___assert_func'
collect2: ld はステータス 1 で終了しました
Kei-Valuestar@Kei: ~/C_and_C++_Programs/Cpp_Programs
------------------------------------------------------------
引き続き、よろしくお願い致します。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# const char** p;のとき、free(p)でC4090エラーとなるのはなぜですか 3 2023/03/31 16:28
- C言語・C++・C# Cのオブジェクトファイルの逆アセンブル 5 2023/05/13 01:51
- C言語・C++・C# c言語でユーザ関数を利用して入力された文字列を反転させるプログラムを作りたいです。 3 2023/01/29 19:47
- Ruby 教えてください 2 2023/01/04 17:50
- C言語・C++・C# c言語の問題の説明、各所ごとに 5 2023/07/26 11:03
- C言語・C++・C# C言語で再起関数とポインタを用いて文字列反転をする方法がわかりません。 4 2023/04/29 20:32
- C言語・C++・C# 宣言する関数の形が決まっている状態で、 str1とstr2の文字列をこの順に引っ付けてstrに保存し 2 2022/05/30 18:21
- C言語・C++・C# C言語の課題が出たのですが自力でやっても分かりませんでした。 要素数がnであるint型の配列v2の並 3 2022/11/19 17:41
- C言語・C++・C# C++プログラミングコードにポリモーフィズムを取り入れ方を教えてください。 2 2023/06/09 11:17
- C言語・C++・C# C言語のエラーについて 2 2022/07/11 13:56
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
宣言による処理の重さ
-
getchar()を int でとる理由...
-
c言語
-
ConvertINetStringについて
-
MFCでのBITMAP作成について
-
for文 アスタリスクで形を作る
-
char* を渡したとき、不適切なP...
-
ワイルドカードを用いた文字列検索
-
YUV⇔RGB変換がうまくいきません。
-
C言語エラーについて
-
アドレスの中身を参照する方法
-
あるシーケンスに含まれるある...
-
配列から指定するデータを取り...
-
メモリの再確保について
-
C言語について
-
LCD表示の制御
-
strcmp と strcpy の使い方で疑問
-
コマンドラインに入力されてい...
-
phpMyAdminからストアドプロシ...
-
sprintfに同じ変数は使えるか
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
fgetsなどのときのstdinのバッ...
-
文字列から空白を取り除きたい...
-
CStringをwchar_tに変換したい
-
charからLPTSTRへの変換方法
-
テキストデータをそのままバイ...
-
c++ 文字列を入力して、一文字...
-
'const char *' 型は 'char *' ...
-
間接操作のレベルとは
-
WORDをcharに変換する方法
-
strncpyと_tcsncpy_sのヌルの扱...
-
型変換
-
配列をnビットシフトする
-
atoi( ) の反対をやりたい
-
Win32APIでのエディットボック...
-
間接参照のレベルが異なっています
-
c言語配列の結合についてです。...
-
【C言語】テキストファイル内の...
-
double型の値をchar配列に変換...
-
switch文で文字を比較すること...
-
C言語のfor文です。 繰り返しの...
おすすめ情報