重要なお知らせ

「教えて! goo」は2025年9月17日(水)をもちまして、サービスを終了いたします。詳細はこちら>

電子書籍の厳選無料作品が豊富!

こんにちは。

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件)

「完全なソース」も出してもらえませんか?

    • good
    • 0
この回答へのお礼

御回答ありがとうございます。

返信が遅くなって申し訳ございませんでした。
完全なソースは以下の通りです。

#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;
}


何か分かりましたら、よろしくお願い致します。

お礼日時:2012/08/14 03:53

リンク時の設定のミスではないかと思うのですが、私にはよくわかりません。



-vオプションを付ければ、ビルド時の色々な設定が出てくるので、それを載せれば誰か分かる人が出てくるかもしれません。
    • good
    • 0
この回答へのお礼

御回答ありがとうございます。

>-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
------------------------------------------------------------

引き続き、よろしくお願い致します。

お礼日時:2012/08/13 01:09

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!