約 6,652,573 件
https://w.atwiki.jp/nico_nonono/pages/20.html
いろいろメモ error LNK2005 1 libcmtd.lib(dbgheap.obj) error LNK2005 __heap_alloc は既に LIBCMT.lib(malloc.obj) で定義されています。 1 libcmtd.lib(dbgheap.obj) error LNK2005 __recalloc は既に LIBCMT.lib(recalloc.obj) で定義されています。 1 libcmtd.lib(dbgheap.obj) error LNK2005 __msize は既に LIBCMT.lib(msize.obj) で定義されています。 ↑みたいなエラーが出た時 「プロジェクト」⇒「プロパティ」⇒「C/C++」⇒「コード生成」のランタイムライブラリの設定が違う可能性ある。 ランタイムライブラリの設定はlib生成時とプログラムコンパイル時で合わせないといけない。 lib生成時に「マルチスレッド (/MT)」と「マルチスレッド デバッグ(/MTd)」どちらで生成したか確認する。
https://w.atwiki.jp/bambooflow/pages/131.html
SystemC Visual C++2008 Express EditionでのHello World!!! SystemCライブラリのインストールが完了したら、やっぱりまずはハロー プログラムでしょう。 プロジェクトの作成から設定の仕方、「Hello, SystemC!!!」と表示させるまでの流れをここで説明する。 ここで、SystemCのバージョンは2.2.0で、インストール先はC \systemc-2.2.0として説明する。 SystemCライブラリの生成方法がわからない場合はこちらを参照。 SystemC Visual C++2008 Express EditionでのHello World!!!プロジェクト作成 プログラム準備 プロジェクトの設定(プロパティ設定) SystemCライブラリの追加 コンパイル(ビルド) 実行 もしも、コンパイルでこんなエラーがでたら プロジェクト作成 ファイルから新規作成→プロジェクトを選択。 新しいプロジェクト ウィンドウで、プロジェクトの種類をVisual C++のWin32を選択して、Win32コンソール アプリケーションを選ぶ。 各項目を設定プロジェクトファイル名:Hello01 場所:C \systemc-2.2.0\MySrc ソリューション:新しいソリューションを作成するソリューションのディレクトリを作成のチェックボックスは解除(付けない) 設定が完了したらOKをクリック。 次へをクリック。 アプリケーションの設定コンソール アプリケーションを選択 追加のオプションは、空のプロジェクトをチェック 完了をクリック。 プログラム準備 作成したプロジェクトのフォルダに、プログラム「Hello01.cpp」を準備する。準備方法はどのようにでもかまわない。(ファイル→新規作成→ファイル から作っても良いし、メモ帳で作ってもよい) 作成したプログラムは、プロジェクトのソースファイルとして登録する。登録の仕方はツリー上のソースファイルを右クリックして「追加→既存の項目」で選択してもよいし、ファイルをDrag Dropで追加してもよい。 hello01.cpp #include systemc.h int sc_main( int argc, char* argv[] ) { printf( "Hello, SystemC!!!\n" ); return 0; } プロジェクトの設定(プロパティ設定) メニュのプロジェクトからプロパティを選択。 全般の構成の種類は、アプリケーション(.exe)であることを確認する。 C/C++の追加のインクルード ディレクトリに、"C \systemc-2.2.0\src\"を追加する。 C/C++の簡易リビルドを行なうは"いいえ"を選択。 C/C++のランタイム ライブラリは"マルチスレッド デバッグ(/MTd)"を選択。(SystemC.libの作成時と同じ設定でなければならない) これで、プロパティの設定は完了。 SystemCライブラリの追加 SystemCライブラリをDrap Dropでプロジェクトのソースファイルに追加する。プロパティとして設定もできるが、面倒くさかったので今回これで済ませた。 コンパイル(ビルド) メニューのビルドからソリューションのビルドを選択。 コンパイルが正常に完了したことを確認する。 実行 メニュのデバッグからデバッグなしで開始を選択。するとコマンドプロンプトが実行されるはず。 コマンドプロンプト上に「Hello, SystemC!!!」が表示されたら成功!! 終わり。 もしも、コンパイルでこんなエラーがでたら リンク時に次のようなエラーが出た。 1 LIBCMTD.lib(dbgheap.obj) error LNK2005 __heap_alloc は既に LIBCMT.lib(malloc.obj) で定義されています。 1 LIBCMTD.lib(dbgheap.obj) error LNK2005 __recalloc は既に LIBCMT.lib(recalloc.obj) で定義されています。 ・・・ C/C++のコード生成で、ランタイム ライブラリの選択が誤っている可能性がある。 ランタイムライブラリの設定はSystemC.lib生成時とプログラムのコンパイル時で合わせないといけない。 今回のエラーでは、SystemC.lib生成時に"マルチスレッド (/MT)"を選択して、プログラムのコンパイル時に、"マルチスレッド デバッグ(/MTd)"を選択したことが原因。 VC初心者の私は、このエラーにかなり悩まされた。 以上
https://w.atwiki.jp/bokuyo/pages/177.html
zlib 1.2.6 を導入したときのメモ zlib 1.2.6(January 29, 2012) をWindows 環境に導入します。 今回は3通りの方法でビルドしていますNMAKE を使ってビルドする方法 Visual C++ 2010 で新規プロジェクトを作ってビルドする方法 Visual C++ 2010 でzlib が用意してくれてるプロジェクトを使ってビルドする方法 Visual C++ 2010, Visual Studio 2012 で手早くビルドしたい場合は以下をご覧くださいませzlib 1.2.6 をVisual C++でビルドする zlib 1.2.7 を Visual Studio 2012 RC でビルドする zlib 1.2.7 を Visual Studio 2012 Express でビルドする ダウンロード http //zlib.net/(公式サイト)から「zlib source code, version 1.2.6, zipfile format」をダウンロードします。 ダウンロードした"zlib126.zip" ファイルを解凍します。 アプリケーションに合わせて NMAKE する 解凍した zlib-1.2.6 フォルダを開きます "zlib-1.2.6/win32/Makefile.msc"をテキストファイルとして開きます。 開くと、以下のようにコンパイラオプション・リンカ―オプションが列挙されています。 CFLAGS = -nologo -MD -W3 -O2 -Oy- -Zi -Fd"zlib" $(LOC) WFLAGS = -D_CRT_SECURE_NO_DEPRECATE -D_CRT_NONSTDC_NO_DEPRECATE ASFLAGS = -coff -Zi $(LOC) LDFLAGS = -nologo -debug -incremental no -opt ref ARFLAGS = -nologo RCFLAGS = /dWIN32 /r zlib を使用するアプリケーションに合わせて、この部分を適切に書き換える必要があります。 ぼくはCFLAGS の部分を"-MD" から"-MT"に変更しました。 CFLAGS = -nologo -MT -W3 -O2 -Oy- -Zi -Fd"zlib" $(LOC) 参考までに、Visual C++ 2010 のプロジェクトのプロパティとの対応表。こんな感じ。 オプション Visual C++ 2010のプロパティとの対応 -nologo 構成プロパティ C/C++ 全般 著作権情報の非表示 はい(/nologo) -MT 構成プロパティ C/C++ コード生成 ランライム ライブラリ マルチスレッド(/MT) -W3 構成プロパティ C/C++ 全般 警告レベル Level3(/W3) -O2 構成プロパティ C/C++ 最適化 実行速度の最大化(/O2) -Oy- 構成プロパティ C/C++ 最適化 フレームポインターなし いいえ(/Oy-) -Zi 構成プロパティ C/C++ 全般 デバッグ情報の形式 プログラム データベース(/Zi) 「$(LOC)」はnmake するときにコンソールに渡す変数です。 # optional build flags LOC = まずはこれでビルドしてみます。 コマンドプロンプトを開き、まずはVisual C++ の環境変数を読み込みます。 "C \Program Files\Microsoft Visual Studio 10.0\VC\bin\vcvars32.bat" NMAKE します。 C \Users\hoge "C \Program Files\Microsoft Visual Studio 10.0\VC\bin\vcvars32.bat" Setting environment for using Microsoft Visual Studio 2010 x86 tools. C \Users\hoge cd Desktop/zlib-1.2.6/ C \Users\hoge\Desktop\zlib-1.2.6 nmake -f win32/Makefile.msc LOC="-DASMV -DASMINF" 失敗します。 (... 省略) link -nologo -debug -incremental no -opt ref -def win32/zlib.def -dll -i mplib zdll.lib -out zlib1.dll -base 0x5A4C0000 adler32.obj compress.obj crc32.obj deflate.obj gzclose.obj gzlib.obj gzread.obj gzwrite.obj infback.obj inflate.obj inftrees.obj inffast.obj trees.obj uncompr.obj zutil.obj zlib1.res ライブラリ zdll.lib とオブジェクト zdll.exp を作成中 deflate.obj error LNK2019 未解決の外部シンボル _match_init が関数 _lm_init で参照されました。 deflate.obj error LNK2019 未解決の外部シンボル _longest_match が関数 _deflate_fast で参照されました。 infback.obj error LNK2019 未解決の外部シンボル _inflate_fast が関数 _inflateBack で参照されました。 inflate.obj error LNK2001 外部シンボル "_inflate_fast" は未解決です。 zlib1.dll fatal error LNK1120 外部参照 3 が未解決です。 NMAKE fatal error U1077 "C \Program Files\Microsoft Visual Studio 10.0\VC\BIN\link.EXE" リターン コード 0x460 Stop. C \Users\hoge\Desktop\zlib-1.2.6 コンパイルは成功していますが、リンクに失敗しています。 Makefile.msc を見てみると上のほうにUsage で使い方が書いてます。OBJA を見落としてました。 C \Users\hoge\Desktop\zlib-1.2.6 nmake -f win32/Makefile.msc LOC="-DASMV -DASMINF" OBJA="inffas32.obj match686.obj" これでエラーが出なければ成功です。 zlib-1.2.6 フォルダにそれぞれlib, dll ファイルができていると思います。zdll.lib zlib.dll zlib1.dll 面倒なのでVisual C++ 2010 でプロジェクトを作ってビルドする いろいろ試してみましたが、たぶんVisual C++ でビルドするほうが楽です。中間ディレクトリ・出力ディレクトリの指定、あるいはDebug, Release の切り替えなどを行うならもうプロジェクト作っちゃいましょう。 適当な場所に新しいディレクトリを作る 適当な場所に新しいディレクトリを作ります。ここでは「zlib_msvc_v126」ディレクトリにしました Visual C++ 2010 を開き、[ファイル]- [新規作成]- [プロジェクト]- [空のプロジェクト] "zlib_msvc_v126" ディレクトリ内にプロジェクトとソリューションファイルを作ってください。 今回はプロジェクト名を「zlib_v126」にしました。 いったんソリューションを閉じます。 "zlib_msvc_v126/zlib_v126" ディレクトリを"zlib_msvc_v126/Source" ディレクトリに名前を変更します。 zlib_msvc_v126/Source/zlib_v126.sln をもう一度開きます。 zlib_msvc_v126/zlib_v126/zlib_v126 ディレクトリにプロジェクトファイルなどがあるので、そこに解凍したzlib-1.2.6 フォルダをコピペしておきます。 Visual C++ プロジェクトにファイルを追加する Visual C++ 上のソリューションエクスプローラーからzlib_v126 プロジェクトを[右クリック]- [追加]- [既存の項目]zlib_msvc_v126/Source/zlib_v126/zlib-1.2.6 の中身をすべて追加します。(ヘッダーファイル(.h)とインプリメントファイル(.c)のみでおっけーです) ("adler32.c" "compress.c" "crc32.c" "crc32.h" "deflate.c" "deflate.h" "gzclose.c" "gzguts.h" "gzlib.c" "gzread.c" "gzwrite.c" "infback.c" "inffast.c" "inffast.h" "inffixed.h" "inflate.c" "inflate.h" "inftrees.c" "inftrees.h" "trees.c" "trees.h" "uncompr.c" "zconf.h" "zlib.h" "zutil.h" "zutil.c" ) プロジェクトのプロパティを変更します。 [プロジェクト]- [zlib_v126 のプロパティ]Debug, Release どちらも変更するのを忘れずに。 [プロパティ]- [構成プロパティ]- [全般] 構成の種類 スタティック ライブラリ (.lib) 出力ディレクトリ $(SolutionDir)..\Obj\$(Configuration)\ 中間ディレクトリ $(ProjectDir)Obj\$(Configuration)\ [プロパティ]- [構成プロパティ]- [C/C++]- [コード生成] Debug Release ランタイム ライブラリ マルチスレッド デバッグ (/MTd) マルチスレッド (/MT) あとはDebug, Release のそれぞれでビルドすればできあがり。 "zlib_msvc_v126/Obj"ディレクトリにそれぞれ "zlib_v126.lib" ができあがっていると思います。 NMAKE よりはこっちのほうが管理が楽そうです。 あとで気づきました zlib-1.2.6/contrib/vstudio/vc10 にVisual C++ 用のプロジェクトファイルがありました。 zlib-1.2.6/contrib/vstudio/vc10/zlibvc.sln をVisual C++ 2010 で開きます プロパティを見てみると、MTd, MT にそれぞれ設定されているみたいです。 そのままDebug, Release ビルドします。warning と error が出ると思います。(以下では、warning を省略してます) 1 ------ ビルド開始 プロジェクト zlibvc, 構成 Debug Win32 ------ 2 ------ ビルド開始 プロジェクト testzlib, 構成 Debug Win32 ------ 3 ------ ビルド開始 プロジェクト zlibstat, 構成 Debug Win32 ------ 2 LINK fatal error LNK1104 ファイル ..\..\masmx86\match686.obj を開くことができません。 1 LINK fatal error LNK1104 ファイル ..\..\masmx86\match686.obj を開くことができません。 4 ------ ビルド開始 プロジェクト testzlibdll, 構成 Debug Win32 ------ 5 ------ ビルド開始 プロジェクト minizip, 構成 Debug Win32 ------ 6 ------ ビルド開始 プロジェクト miniunz, 構成 Debug Win32 ------ 6 LINK fatal error LNK1104 ファイル x86\ZlibDllDebug\zlibwapi.lib を開くことができません。 5 LINK fatal error LNK1104 ファイル x86\ZlibDllDebug\zlibwapi.lib を開くことができません。 4 LINK fatal error LNK1104 ファイル x86\ZlibDllDebug\zlibwapi.lib を開くことができません。 ========== ビルド 1 正常終了、5 失敗、0 更新不要、0 スキップ ========== 失敗しました。「zlib-1.2.6/contrib/masmx86/ ディレクトリにmatch86.obj がないよ」とのことです。 zlib-1.2.6/contrib/vstudio/readme.txt を読むとちゃんと手順が書いてありました。 コマンドプロンプトを開き、以下を順に実行。vcvars32.bat で環境変数を読み込んで、bld_ml32.bat でinffas32.obj と match686.obj をビルドしてます "C \Program Files\Microsoft Visual Studio 10.0\VC\bin\vcvars32.bat" cd Desktop/zlib-1.2.6/contrib/masmx86 bld_ml32.bat zlibvc プロジェクトのプロパティを開き、[構成プロパティ]- [全般]ターゲット名を"$(ProjectName)" から "zlibwapi" に変更してください。 ビルドします.lib, .dll が上手くビルドされます。しかし、test コードのビルドでリンカエラーが出てます。 2 zutil.obj error LNK2019 未解決の外部シンボル _gzflags@0 が関数 _zlibCompileFlags@0 で参照されました。 2 x86\TestZlibDebug\testzlib.exe fatal error LNK1120 外部参照 1 が未解決です。 testzlib プロジェクトのプロパティを開き、[構成プロパティ]- [リンカー]- [入力]追加の依存ファイルに"x86\ZlibStatDebug\zlibstat.lib" を追加します(Debug 時) Release 時も同様に"x86\ZlibStatRelease\zlibstat.lib" を追加しておいてください。 これでビルドします。たぶん成功するはずです。 スタティックライブラリを使ってみましょう 使用するプロジェクト内に以下のファイルをコピーしておきましょうzlib-1.2.6/zconf.h zlib-1.2.6/zlib.h ビルドして出力された.lib ファイル(zlib_v126.lib) .lib ファイルをVisual C++ でプロジェクトに追加しましょう[プロパティ]- [構成プロパティ]- [リンカー]- [全般]- [追加のライブラリ ディレクトリ] 面倒なので #pragma comment でおっけー #pragma comment(lib, "zlib_v126.lib") LIBCMT との競合が起きた場合 1 libcmt.lib(invarg.obj) error LNK2005 __initp_misc_invarg は既に LIBCMTD.lib(invarg.obj) で定義されています。 1 libcmt.lib(invarg.obj) error LNK2005 __call_reportfault は既に LIBCMTD.lib(invarg.obj) で定義されています。 1 libcmt.lib(invarg.obj) error LNK2005 __set_invalid_parameter_handler は既に LIBCMTD.lib(invarg.obj) で定義されています。 1 libcmt.lib(invarg.obj) error LNK2005 __get_invalid_parameter_handler は既に LIBCMTD.lib(invarg.obj) で定義されています。 1 libcmt.lib(invarg.obj) error LNK2005 __invoke_watson は既に LIBCMTD.lib(invarg.obj) で定義されています。 1 libcmt.lib(invarg.obj) error LNK2005 "void __cdecl _invoke_watson(unsigned short const *,unsigned short const *,unsigned short const *,unsigned int,unsigned int)" (?_invoke_watson@@YAXPBG00II@Z) は既に LIBCMTD.lib(invarg.obj) で定義されています。 1 libcmt.lib(invarg.obj) error LNK2005 __invalid_parameter は既に LIBCMTD.lib(invarg.obj) で定義されています。 1 libcmt.lib(invarg.obj) error LNK2005 "void __cdecl _invalid_parameter(unsigned short const *,unsigned short const *,unsigned short const *,unsigned int,unsigned int)" (?_invalid_parameter@@YAXPBG00II@Z) は既に LIBCMTD.lib(invarg.obj) で定義されています。 1 libcmt.lib(invarg.obj) error LNK2005 ___pInvalidArgHandler は既に LIBCMTD.lib(invarg.obj) で定義されています。 1 libcpmtd.lib(xdebug.obj) warning LNK4098 defaultlib libcmt.lib は他のライブラリの使用と競合しています。/NODEFAULTLIB library を使用してください。 [構成プロパティ]- [リンカ―]- [入力]- [特定の既定のライブラリの無視]- "LIBCMT" を追加 LIBCMT を無視することでしのぐこともできるが根本的に、nmake したzlib とzlib を使用するアプリケーションでランタイムライブラリが違う可能性が高い"/MT" でnmake したzlib を"/MTd" のアプリケーションで使うと出る。 もう一度NMAKE したときのメモ 次の命名規則に従って、.lib, .dll ファイルをmake する ランタイム ライブラリ .lib 名 DLL 名 マルチスレッドDLL(/MD) lib_zlib_vc100_mt_v1_26.lib zlib_vc100_mt_v1_26.dll マルチスレッドデバッグDLL(/MDd) lib_zlib_vc100_mt_gd_v1_26.lib zlib_vc100_mt_gd_v1_26.dll マルチスレッド(/MT) lib_zlib_vc100_mt_s_v1_26.lib なし マルチスレッドデバッグ(/MTd) lib_zlib_vc100_mt_sgd_v1_26.lib なし 命名規則vc100 - Visual C++ 2010 (ex. vc90 = Visual C++ 2008) gd - デバッグ(debug version) s - 静的リンクライブラリ(static link) mt - マルチスレッド(Multithreaded) v1_26 - zlib version 1.26 マルチスレッド(/MT) win32/MakeFile.msc を書き換える # variables STATICLIB = lib_zlib_vc100_mt_s_v1_26.lib CFLAGS = -nologo -MT -W3 -O2 -Oy- -Z7 -Fd"zlib" $(LOC) あとはこのページの上のほうに書いた通り、nmake! マルチスレッドデバッグ(/MTd) win32/MakeFile.msc を書き換える # variables STATICLIB = lib_zlib_vc100_mt_sgd_v1_26.lib CFLAGS = -nologo -MTd -W3 -O2 -Oy- -Z7 -Fd"zlib" $(LOC) あとはこのページの上のほうに書いた通り、nmake! 関連リンク http //zlib.net/ - zlib 公式サイト コンパイラ オプション一覧 (アルファベット順) MSDN - コンパイラ オプション MSDN - リンカー オプション MSDN - NMAKE リファレンス MSDN - /Z7、/Zi、/ZI (デバッグ情報の形式)
https://w.atwiki.jp/bokuyo/pages/51.html
こうして僕はエラーにはまった。(Ogg/Vorbisライブラリビルド編) はじめに このページは2010年の12月ごろにエラーにはまった際のログを残しているページです。 そのせいかなんだか見にくいです。 それと無知ゆえに嘘ばかり書いています。うのみにしないでください。 Ogg/Vorbis のビルド手順だけをまとめた項目が見たい方は以下のページをご参照ください。Ogg/Vorbis ライブラリを再びビルドしてみる ぼくの環境編 VisualC++2010 Expressこれを使ってOggとVorbisをインストール(というよりも、プログラムで使うライブラリをビルドしちゃおう)な感じです。 ダウンロード/解凍編 http //www.xiph.org/downloads/より、「libogg-1.2.2.zip」「libvorbis-1.3.2.zip」をダウンロードした。そんでもって解凍。 「libogg-1.2.2」「libvorbis-1.3.2」の2つのフォルダができた。 フォルダ名に「.」だの「-」だのが入ってて気持ち悪かったので「libogg」「libvorbis」にフォルダ名をそれぞれ変更。 LibOgg(DLL)ビルド編 libogg win32 VS2010 libogg_dynamic.slnをVC++2010 Expressにて開く。 VC++の"出力"欄に以下のように書かれている…。なにこれ…。 C \libogg\win32\VS2010\libogg_dynamic.vcxproj warning プロジェクト ファイル libogg で参照されているプラットフォーム x64 が見つかりません。 プラットフォームが %VCTargetsPath%\Platforms\x64\ にインストールされていることを確認してください。 どうやら 通常のVC++2010 Expressでは64bit向けのソフトウェアが作れないみたい。 なので、64bit向けに作れるように、Windows SDK7.1を導入することに。 そもそも DirectXやら何やら、いろんなところでよく見かける「x86」「x64」というのはインテルが作った"規格(…のようなもの)"のことだそうで。とりあえず、「x86」は"32bit"、「x64」は"64bit"という認識さえ持っておけば十分かな、って思う。 ちなみにWindows SDK7.1はダウンロードサイズは500KBほどと小さいのだけども、インストールすると1.6GBも必要になるから要注意。 そんなこんなで WindowsSDK7.1を導入後、libogg_dynamic.slnを開いてみると、VC++たんに何も言われなかった。ちょっとだけ悲しい。 ひとまずdefaultのままビルドしてみることに。 Debugでビルドしてみた。(/MDd) 1 ------ ビルド開始 プロジェクト libogg, 構成 Debug Win32 ------ 1 framing.c 1 bitwise.c 1 コードを生成中... 1 bitwise.obj warning LNK4075 /EDITANDCONTINUE は /OPT ICF の指定によって無視されます。 1 ライブラリ C \libogg\win32\VS2010\Win32\Debug\libogg.lib とオブジェクト C \libogg\win32\VS2010\Win32\Debug\libogg.exp を作成中 1 libogg_dynamic.vcxproj - C \libogg\win32\VS2010\Win32\Debug\libogg.dll ========== ビルド 1 正常終了、0 失敗、0 更新不要、0 スキップ ========== Releseでビルドしてみた。(/MD) 1 ------ ビルド開始 プロジェクト libogg, 構成 Release Win32 ------ 1 bitwise.c 1 framing.c 1 ライブラリ C \libogg\win32\VS2010\Win32\Release\libogg.lib とオブジェクト C \libogg\win32\VS2010\Win32\Release\libogg.exp を作成中 1 コード生成しています。 1 コード生成が終了しました。 1 libogg_dynamic.vcxproj - C \libogg\win32\VS2010\Win32\Release\libogg.dll ========== ビルド 1 正常終了、0 失敗、0 更新不要、0 スキップ ========== とりあえずおっけー? C \libogg\win32\VS2010\Win32\Debug\libogg.lib C \libogg\win32\VS2010\Win32\Debug\libogg.dll C \libogg\win32\VS2010\Win32\Release\libogg.lib C \libogg\win32\VS2010\Win32\Release\libogg.dll ちゃんとできてました。使えるかどうかは使ってないのでまだわかりませんがとりあえずおっけー。 LibOgg(Static)ビルド編 libogg win32 VS2010 libogg_static.slnをVC++2010 Expressにて開く。 "LibOgg(DLL)ビルド編"でWindowsSDK7.1を導入したおかげか、.slnを開いた時点では何も出力がなかった。ありがたき幸せ。 ひとまず、defaultの設定でビルドすることに。 Debugでビルドしてみた。(/MDd) 1 ------ ビルド開始 プロジェクト libogg_static, 構成 Debug Win32 ------ 1 framing.c 1 bitwise.c 1 コードを生成中... 1 libogg_static.vcxproj - C \libogg\win32\VS2010\Win32\Debug\libogg_static.lib ========== ビルド 1 正常終了、0 失敗、0 更新不要、0 スキップ ========== Releseでビルドしてみた。(/MD) 1 ------ ビルド開始 プロジェクト libogg_static, 構成 Release Win32 ------ 1 bitwise.c 1 framing.c 1 libogg_static.vcxproj - C \libogg\win32\VS2010\Win32\Release\libogg_static.lib ========== ビルド 1 正常終了、0 失敗、0 更新不要、0 スキップ ========== ま、まあ、とりあえず… C \libogg\win32\VS2010\Win32\Debug\libogg_static.lib C \libogg\win32\VS2010\Win32\Release\libogg_static.lib おっけーなのかしらね…。 でも、このように「/MD」で作ったlibogg_static.libを使用するプログラムが「/MT」だった場合、どうなるんでしょう?? この疑問は、いったん保留して次のをビルドします。 LibVorbis(DLL)ビルド編 C \libvorbis\win32\VS2010\vorbis_dynamic.slnをVC++2010 Expressにて開く。 これまたVC++の出力欄には何も表示されず、なんなく開けちゃった☆ Debugでビルドしてみた。(/MDd) 1 ------ ビルド開始 プロジェクト libvorbis, 構成 Debug Win32 ------ 1 window.c (…300行にわたるほど長すぎるので中略。) ========== ビルド 4 正常終了、0 失敗、0 更新不要、0 スキップ ========== ビルド結果全部みる- libvorbis_dynamic_Debug_BuildResult_201012180841.txt warningがいっぱいでた!castをちゃんとしてないからコンパイラたんに怒られちゃったじゃないか!! でも一応成功っぽい。 Releseでビルドしてみた。(/MD) 1 ------ ビルド開始 プロジェクト libvorbis, 構成 Release Win32 ------ 1 analysis.c (…これまた70行ほどあって長すぎるので中略。) 4 コード生成しています。 4 コード生成が終了しました。 4 vorbisenc_dynamic.vcxproj - C \libvorbis\win32\VS2010\Win32\Release\vorbisenc.exe ========== ビルド 4 正常終了、0 失敗、0 更新不要、0 スキップ ========== ビルド結果全部みる- libvorbis_dynamic_Relese_BuildResult_201012180901.txt またwarningがいっぱいでた!cast関連ばかり。。 でも一応成功っぽい。 とりあえずおっけー? C \libvorbis\win32\VS2010\Win32\Debug\libvorbis.lib C \libvorbis\win32\VS2010\Win32\Debug\libvorbis.dll C \libvorbis\win32\VS2010\Win32\Debug\libvorbisfile.lib C \libvorbis\win32\VS2010\Win32\Debug\libvorbisfile.dll C \libvorbis\win32\VS2010\Win32\Release\libvorbis.lib C \libvorbis\win32\VS2010\Win32\Release\libvorbis.dll C \libvorbis\win32\VS2010\Win32\Release\libvorbisfile.lib C \libvorbis\win32\VS2010\Win32\Release\libvorbisfile.dll それぞれできてるっぽいから一応おっけーなのかしら? LibVorbis(Static)ビルド編 C \libvorbis\win32\VS2010\vorbis_static.slnをVC++2010 Expressにて開く。 .slnを開いた時点では、VC++は何も言ってこなかった。ほっと安心。 ひとまず、defaultの設定でビルドすることに。 Debugでビルドしてみた。(/MDd) 1 ------ ビルド開始 プロジェクト libvorbis_static, 構成 Debug Win32 ------ 1 window.c (…長いので中略。) 4 vorbisenc_static.vcxproj - C \libvorbis\win32\VS2010\Win32\Debug\vorbisenc.exe ========== ビルド 4 正常終了、0 失敗、0 更新不要、0 スキップ ========== ビルド結果全部みる- libvorbis_static_Debug_BuildResult_201012180918.txt またwarning…cast!!! でも一応成功っぽい。 Releseでビルドしてみた。(/MD) 1 ------ ビルド開始 プロジェクト libvorbis_static, 構成 Release Win32 ------ 1 analysis.c (…長いので中略。) 1 libvorbis_static.vcxproj - C \libvorbis\win32\VS2010\Win32\Release\libvorbis_static.lib ========== ビルド 1 正常終了、0 失敗、3 更新不要、0 スキップ ========== ビルド結果全部みる- libvorbis_static_Release_BuildResult_201012180932.txt し、失敗!どういうことなの!?warningが原因、それともそれ以外が原因? まさかの C \libvorbis\win32\VS2010\Win32\Debug\libvorbis_static.lib C \libvorbis\win32\VS2010\Win32\Debug\libvorbisfile_static.lib C \libvorbis\win32\VS2010\Win32\Release\libvorbis_static.lib おや…!?Releseフォルダに以下のファイルが見当たらない!!!これはやっぱり、失敗だ! C \libvorbis\win32\VS2010\Win32\Release\libvorbisfile_static.lib ということで libvorbis_static libvorbisfile vorbisdec vorbissenc それぞれのプロジェクトのプロパティを開いて、 「構成プロパティ C/C++ 全般 追加のインクルード ディレクトリ」で C \libvorbis\include C \libogg\include 上の2つをちゃんと追加してみる。もちろんdefaultで指定はされてはいるのだけど、一応ね。 以下のそれぞれで追加のインクルードディレクトリを指定して、もう一度DebugとReleaseをしてみる。 ソリューション構成:Debug ソリューション構成:Release Debugでビルドしてみた。(2回目)(/MDd) ビルド結果全部みる- libvorbis_static_Debug_BuildResult_201012182126.txt Releseでビルドしてみた。(2回目)(/MD) ビルド結果全部みる- libvorbis_static_Release_BuildResult_201012182132.txt えーと リンカがどうのこうのっていう警告がちょっと怪しいけども、とりあえずは成功っぽいねー。 Releseフォルダに以下のファイルがあるのを確認しました。 C \libvorbis\win32\VS2010\Win32\Release\libvorbisfile_static.lib では実際に使ってみたいと思います。 実際に使ってみる。 test.exe の 0x561ac9d0 (msvcr100d.dll) で初回の例外が発生しました 0xC0000005 場所 0x00000000 に書き込み中にアクセス違反が発生しました。 test.exe の 0x561ac9d0 (msvcr100d.dll) でハンドルされていない例外が発生しました 0xC0000005 場所 0x00000000 に書き込み中にアクセス違反が発生しました。 ビルドはうまくいくのに、デバッグ中にエラー発生。 ブレークポイントはさめながらみてる限り、 ov_fopen( "bgm.ogg", oggVorbisFile ); この時点でエラー起こしてるっぽい。 ってことで、/MTでライブラリを生成してみることに。 めんどうなのでStaticのReleaseのみ生成。 libogg_static.slnを開く。 プロパティ 構成プロパティ C/C++ コード生成 ランタイムライブラリ /MT Releaceをビルド。 1 ------ ビルド開始 プロジェクト libogg_static, 構成 Release Win32 ------ 1 bitwise.c 1 framing.c 1 libogg_static.vcxproj - C \libogg\win32\VS2010\Win32\Release\libogg_static.lib ========== ビルド 1 正常終了、0 失敗、0 更新不要、0 スキップ ========== vorbis_static.slnを開く。 4つのプロジェクトそれぞれにたいして、プロパティ 構成プロパティ C/C++ コード生成 ランタイムライブラリ /MT Releaceをビルド。 ビルド結果全部みる- libvorbis_static_Release_BuildResult_201012200344.txt すると、なんと! testプログラムをRelease(/MT)で動かすと。 test.exe の 0x0003823e で初回の例外が発生しました 0xC0000005 場所 0x00000000 に書き込み中にアクセス違反が発生しました。 test.exe の 0x0003823e でハンドルされていない例外が発生しました 0xC0000005 場所 0x00000000 に書き込み中にアクセス違反が発生しました。 testプログラムをDebug(/MTd)で動かすと。 1 ------ ビルド開始 プロジェクト test, 構成 Debug Win32 ------ 1 libcmt.lib(invarg.obj) error LNK2005 __initp_misc_invarg は既に LIBCMTD.lib(invarg.obj) で定義されています。 1 libcmt.lib(invarg.obj) error LNK2005 __call_reportfault は既に LIBCMTD.lib(invarg.obj) で定義されています。 1 libcmt.lib(invarg.obj) error LNK2005 __set_invalid_parameter_handler は既に LIBCMTD.lib(invarg.obj) で定義されています。 1 libcmt.lib(invarg.obj) error LNK2005 __get_invalid_parameter_handler は既に LIBCMTD.lib(invarg.obj) で定義されています。 1 libcmt.lib(invarg.obj) error LNK2005 __invoke_watson は既に LIBCMTD.lib(invarg.obj) で定義されています。 1 libcmt.lib(invarg.obj) error LNK2005 "void __cdecl _invoke_watson(unsigned short const *,unsigned short const *,unsigned short const *,unsigned int,unsigned int)" (?_invoke_watson@@YAXPBG00II@Z) は既に LIBCMTD.lib(invarg.obj) で定義されています。 1 libcmt.lib(invarg.obj) error LNK2005 __invalid_parameter は既に LIBCMTD.lib(invarg.obj) で定義されています。 1 libcmt.lib(invarg.obj) error LNK2005 "void __cdecl _invalid_parameter(unsigned short const *,unsigned short const *,unsigned short const *,unsigned int,unsigned int)" (?_invalid_parameter@@YAXPBG00II@Z) は既に LIBCMTD.lib(invarg.obj) で定義されています。 1 libcmt.lib(invarg.obj) error LNK2005 ___pInvalidArgHandler は既に LIBCMTD.lib(invarg.obj) で定義されています。 1 libogg_static.lib(framing.obj) MSIL .netmodule または /GL を伴ってコンパイルされたモジュールが見つかりました。/LTCG を使用して再開始してください。リンカーのパフォーマンスを向上させるためには、コマンドラインに /LTCG を追加してください。 1 libcmt.lib(invarg.obj) error LNK2005 ___pInvalidArgHandler は既に LIBCMTD.lib(invarg.obj) で定義されています。 1 libcmt.lib(invarg.obj) error LNK2005 __initp_misc_invarg は既に LIBCMTD.lib(invarg.obj) で定義されています。 1 libcmt.lib(invarg.obj) error LNK2005 __call_reportfault は既に LIBCMTD.lib(invarg.obj) で定義されています。 1 libcmt.lib(invarg.obj) error LNK2005 __set_invalid_parameter_handler は既に LIBCMTD.lib(invarg.obj) で定義されています。 1 libcmt.lib(invarg.obj) error LNK2005 __get_invalid_parameter_handler は既に LIBCMTD.lib(invarg.obj) で定義されています。 1 libcmt.lib(invarg.obj) error LNK2005 __invoke_watson は既に LIBCMTD.lib(invarg.obj) で定義されています。 1 libcmt.lib(invarg.obj) error LNK2005 "void __cdecl _invoke_watson(unsigned short const *,unsigned short const *,unsigned short const *,unsigned int,unsigned int)" (?_invoke_watson@@YAXPBG00II@Z) は既に LIBCMTD.lib(invarg.obj) で定義されています。 1 libcmt.lib(invarg.obj) error LNK2005 __invalid_parameter は既に LIBCMTD.lib(invarg.obj) で定義されています。 1 libcmt.lib(invarg.obj) error LNK2005 "void __cdecl _invalid_parameter(unsigned short const *,unsigned short const *,unsigned short const *,unsigned int,unsigned int)" (?_invalid_parameter@@YAXPBG00II@Z) は既に LIBCMTD.lib(invarg.obj) で定義されています。 1 LIBCMTD.lib(crt0init.obj) warning LNK4098 defaultlib libcmt.lib は他のライブラリの使用と競合しています。/NODEFAULTLIB library を使用してください。 1 C \Documents\Visual Studio 2010\Projects\test\Debug\test.exe fatal error LNK1169 1 つ以上の複数回定義されているシンボルが見つかりました。 ========== ビルド 0 正常終了、1 失敗、0 更新不要、0 スキップ ========== ちなみに、Debug(/MDd)でも。 1 ------ ビルド開始 プロジェクト test, 構成 Debug Win32 ------ 1 libcmt.lib(invarg.obj) error LNK2005 __invoke_watson は既に MSVCRTD.lib(MSVCR100D.dll) で定義されています。 1 libcmt.lib(crt0dat.obj) error LNK2005 __initterm_e は既に MSVCRTD.lib(MSVCR100D.dll) で定義されています。 1 libcmt.lib(crt0dat.obj) error LNK2005 _exit は既に MSVCRTD.lib(MSVCR100D.dll) で定義されています。 1 libcmt.lib(crt0dat.obj) error LNK2005 __exit は既に MSVCRTD.lib(MSVCR100D.dll) で定義されています。 1 libcmt.lib(crt0dat.obj) error LNK2005 __cexit は既に MSVCRTD.lib(MSVCR100D.dll) で定義されています。 1 libcmt.lib(crt0dat.obj) error LNK2005 __amsg_exit は既に MSVCRTD.lib(MSVCR100D.dll) で定義されています。 1 libcmt.lib(ftell.obj) error LNK2005 _ftell は既に MSVCRTD.lib(MSVCR100D.dll) で定義されています。 1 libcmt.lib(mlock.obj) error LNK2005 __unlock は既に MSVCRTD.lib(MSVCR100D.dll) で定義されています。 1 libcmt.lib(mlock.obj) error LNK2005 __lock は既に MSVCRTD.lib(MSVCR100D.dll) で定義されています。 1 libcmt.lib(winxfltr.obj) error LNK2005 __XcptFilter は既に MSVCRTD.lib(MSVCR100D.dll) で定義されています。 1 libcmt.lib(hooks.obj) error LNK2005 "void __cdecl terminate(void)" (?terminate@@YAXXZ) は既に MSVCRTD.lib(MSVCR100D.dll) で定義されています。 1 libcmt.lib(crt0init.obj) error LNK2005 ___xi_a は既に MSVCRTD.lib(cinitexe.obj) で定義されています。 1 libcmt.lib(crt0init.obj) error LNK2005 ___xi_z は既に MSVCRTD.lib(cinitexe.obj) で定義されています。 1 libcmt.lib(crt0init.obj) error LNK2005 ___xc_a は既に MSVCRTD.lib(cinitexe.obj) で定義されています。 1 libcmt.lib(crt0init.obj) error LNK2005 ___xc_z は既に MSVCRTD.lib(cinitexe.obj) で定義されています。 1 libcmt.lib(errmode.obj) error LNK2005 ___set_app_type は既に MSVCRTD.lib(MSVCR100D.dll) で定義されています。 1 libcmt.lib(setlocal.obj) error LNK2005 __configthreadlocale は既に MSVCRTD.lib(MSVCR100D.dll) で定義されています。 1 libogg_static.lib(framing.obj) MSIL .netmodule または /GL を伴ってコンパイルされたモジュールが見つかりました。/LTCG を使用して再開始してください。リンカーのパフォーマンスを向上させるためには、コマンドラインに /LTCG を追加してください。 1 libcmt.lib(invarg.obj) error LNK2005 __invoke_watson は既に MSVCRTD.lib(MSVCR100D.dll) で定義されています。 1 libcmt.lib(crt0dat.obj) error LNK2005 __initterm_e は既に MSVCRTD.lib(MSVCR100D.dll) で定義されています。 1 libcmt.lib(crt0dat.obj) error LNK2005 _exit は既に MSVCRTD.lib(MSVCR100D.dll) で定義されています。 1 libcmt.lib(crt0dat.obj) error LNK2005 __exit は既に MSVCRTD.lib(MSVCR100D.dll) で定義されています。 1 libcmt.lib(crt0dat.obj) error LNK2005 __cexit は既に MSVCRTD.lib(MSVCR100D.dll) で定義されています。 1 libcmt.lib(crt0dat.obj) error LNK2005 __amsg_exit は既に MSVCRTD.lib(MSVCR100D.dll) で定義されています。 1 libcmt.lib(ftell.obj) error LNK2005 _ftell は既に MSVCRTD.lib(MSVCR100D.dll) で定義されています。 1 libcmt.lib(mlock.obj) error LNK2005 __unlock は既に MSVCRTD.lib(MSVCR100D.dll) で定義されています。 1 libcmt.lib(mlock.obj) error LNK2005 __lock は既に MSVCRTD.lib(MSVCR100D.dll) で定義されています。 1 libcmt.lib(winxfltr.obj) error LNK2005 __XcptFilter は既に MSVCRTD.lib(MSVCR100D.dll) で定義されています。 1 libcmt.lib(hooks.obj) error LNK2005 "void __cdecl terminate(void)" (?terminate@@YAXXZ) は既に MSVCRTD.lib(MSVCR100D.dll) で定義されています。 1 libcmt.lib(crt0init.obj) error LNK2005 ___xi_a は既に MSVCRTD.lib(cinitexe.obj) で定義されています。 1 libcmt.lib(crt0init.obj) error LNK2005 ___xi_z は既に MSVCRTD.lib(cinitexe.obj) で定義されています。 1 libcmt.lib(crt0init.obj) error LNK2005 ___xc_a は既に MSVCRTD.lib(cinitexe.obj) で定義されています。 1 libcmt.lib(crt0init.obj) error LNK2005 ___xc_z は既に MSVCRTD.lib(cinitexe.obj) で定義されています。 1 libcmt.lib(errmode.obj) error LNK2005 ___set_app_type は既に MSVCRTD.lib(MSVCR100D.dll) で定義されています。 1 libcmt.lib(exsup.obj) error LNK2005 __except_list は既に MSVCRTD.lib(dllsupp.obj) で定義されています。 1 libcmt.lib(setlocal.obj) error LNK2005 __configthreadlocale は既に MSVCRTD.lib(MSVCR100D.dll) で定義されています。 1 LINK warning LNK4098 defaultlib MSVCRTD は他のライブラリの使用と競合しています。/NODEFAULTLIB library を使用してください。 1 MSVCRTD.lib(cinitexe.obj) warning LNK4098 defaultlib libcmt.lib は他のライブラリの使用と競合しています。/NODEFAULTLIB library を使用してください。 1 libcmt.lib(crt0.obj) error LNK2001 外部シンボル "_main" は未解決です。 1 C \Documents\Visual Studio 2010\Projects\test\Debug\test.exe fatal error LNK1120 外部参照 1 が未解決です。 ========== ビルド 0 正常終了、1 失敗、0 更新不要、0 スキップ ========== どうやら ライブラリを/MTでReleaseしたのは間違いっぽい。 気を取り直して LibVorbis(Static)ビルド編まで戻る。/MD(/MDd)にすべて戻して またライブラリとしてテストプログラムに組み込む。 とりあえず、特定のライブラリを無視するために、 プロジェクト プロパティ リンカー 入力 特定の既定のライブラリの無視 編集 MSVCRT(またはmsvcrt.lib) OK /GLってやってるみたいだから、 プロジェクト プロパティ 構成プロパティ リンカー コマンドライン 追加オプション /LTCG OK これでテストプログラムをビルドすると、 1 ------ ビルド開始 プロジェクト test, 構成 Debug Win32 ------ 1 WinMain.cpp 1 コード生成しています。 1 コード生成が終了しました。 1 test.vcxproj - C \documents\visual studio 2010\Projects\test\Debug\test.exe ========== ビルド 1 正常終了、0 失敗、0 更新不要、0 スキップ ========== おっけーっぽい。 でもやっぱりランタイムエラーでちゃうっぽい。 test.exe の 0x6edc01d0 (msvcr100.dll) でハンドルされていない例外が発生しました 0xC0000005 場所 0x00000000 に書き込み中にアクセス違反が発生しました。 ってことは、oggを使ってるプログラム自体が間違ってる、としか言いようがないよね。 きっと、ぼくが書いたプログラムが間違ってるはず。 そもそも、どんなプログラムを書いているのか、というと… OggVorbis_File* ovf = NULL; char* filename = "bgm.ogg"; int error = ov_fopen( filename, ovf ); で、冷静に考えてみて、ov_fopen関数の第二引数にいれてるovfが間違ってるのでは…?と思いまして…。 ここ、もしや、確保された構造体のアドレスを渡してあげないといけないんじゃ…、と。 今はNULLの入った構造体のポインタ渡してるけれど、これじゃいつまでたっても0x00000000(=NULL番地)みたいなところにアクセスしちゃうはずだよねー、って思った。だから、深く考えず OggVorbis_File ovf; char* filename = "bgm.ogg"; int error = ov_fopen( filename, ovf ); または、 OggVorbis_File* ovf = new OggVorbis_File(); char* filename = "bgm.ogg"; int error = ov_fopen( filename, ovf ); って感じで。これで通してみたら、 「int error = 0」の値で問題なく、ランタイムエラーも出ずに、めでたしめでたしうまくいきましたとさ。 なんだそういうことかよ、ってオチ。(終) つづき。 lib生成時に、/MT(/MTd)でしないとテストプログラムを/MTでビルドするときビルドエラーが起きる。 なのでogg/vorbisのlibを/MTでまたビルドし直す。libogg_dynamicをDebug(/MTd)でビルド、Releace(/MT)でビルド。正常終了。 libogg_staticをDebug(/MTd)でビルド、Releace(/MT)でビルド。正常終了。 vorbis_dynamicをDebug(/MTd)でビルド。castにたいして警告いっぱいでたけど4つとも正常終了。 vorbis_dynamicをReleace(/MT)でビルド。とくにいっぱい警告も出ず、4つとも正常終了。備考:どのプロジェクトも「特定の既定のライブラリ」は何も指定してない。 vorbis_dynamicをDebug(/MTd)でビルド。castにたいして警告いっぱいでたけど4つとも正常終了。 vorbis_dynamicをReleace(/MT)でビルド。castにたいして警告いっぱいでたけど、4つとも正常終了。備考:どのプロジェクトも「特定の既定のライブラリ」は何も指定してない。 これで/MT(/MTd)のプログラムで使えます。おわりー。 関連リンク MSDN - /NODEFAULTLIB (ライブラリを無視する) MSDN - /LTCG (リンク時のコード生成) MSDN - VCLinkerTool OutputFile プロパティ コメント 名前 コメント
https://w.atwiki.jp/abwiki/pages/59.html
名称 |malloc, calloc, realloc, free 読み |まろっく, きゃろっく, りあろっく, ふりー 定義 |Function malloc(n As DWord) As VoidPtr Function calloc(n As DWord) As VoidPtr Function realloc(m As VoidPtr, n As DWord) As VoidPtr Sub free(m As VoidPtr) 説明 |mallocはメモリを確保します。 callocは0でクリアしたメモリを確保します reallocはメモリを再確保します。 freeは確保したメモリを解放します。 戻り値 |free以外は確保したメモリのポインタを返します。 参照 |ZeroString , memset
https://w.atwiki.jp/bg1wiki/pages/89.html
malloc.c #include stdio.h #include string.h #include stdlib.h int main(void){ char str1[10]; char *p_str2; int n; int i; printf("n "); scanf("%d", n); printf("str1 "); scanf("%s", str1); p_str2 = (char *)malloc(strlen(str1) * n + 1); *p_str2 = \0 ; for(i = 0; i n; i++){ strcat(p_str2, str1); } printf("p_str2 = %s\n", p_str2); free(p_str2); return 0; }
https://w.atwiki.jp/chugoku/pages/83.html
mallocのC言語のライブラリ関数だ。 なんでこんなのがいるかというと「実行するまでどのくらいのメモリを使うかわからない」という場合に使う。 メモリ領域ではヒープ領域というところに作られる。 この例では、free関数を使って解放していない。 しかし、main関数を抜けるとこのアプリケーション自体が無くなるので自動的にOSが解放してくれる。(OSは大抵解放できる能力をもってえいる。必ずではない) 以下のコードは何度もmallocして4バイトの連続したメモリ領域をヒープ領域に作る。 printfでmallocで確保した領域の先頭アドレスとp変数のアドレスを表示している。 C \usr\lesson\opencv\C_C++の練習\malloc type main.cpp stdio.h stdlib.h int main(void){ void *p; p=malloc(4); printf("p address %x\n",p); printf(" p address %x\n", p); p=malloc(4); printf("p address %x\n",p); printf(" p address %x\n", p); p=malloc(4); printf("p address %x\n",p); printf(" p address %x\n", p); return 0; } C \usr\lesson\opencv\C_C++の練習\malloc main.exe p address 384fc8 p address 12ff74 p address 3830c0 p address 12ff74 p address 3830d0 p address 12ff74 p address p変数が指しているアドレス。つまり、mallocで作った領域の先頭アドレス。p変数自体のアドレスは変わらない。 mallocする度に、別のヒープ領域に割り当てられていることに注意。 変数名pに惑わされない。 変数名は同じだが指している先がmallocする度に変る。 変わるということは、free(f)をreturn前に1回しても前の2つは解放できない。 stdio.h stdlib.h int main(void){ void *p; p=malloc(4); printf("p address %x\n",p); printf(" p address %x\n", p); p=malloc(4); printf("p address %x\n",p); printf(" p address %x\n", p); p=malloc(4); printf("p address %x\n",p); printf(" p address %x\n", p); free(p); return 0; } OpenCVの関数でもcreate、clone関係の関数がmallocに相当する。 名前 コメント
https://w.atwiki.jp/from0/pages/23.html
もともとgccにはmallocをhookするAPIがあったんだが、アレは今やdeprecatedらしいぜ。 じゃあどうすればいいかというと「自分でmalloc/free書け」ということらしいが、ちょっと手を加えたいだけのときに全部書くなんてやってられない。 malloc/freeを定義して、ダイナミックにロードした普通のmalloc/freeを呼び出すという方法がある。 dlopenやdlsymもmallocを使うから要注意だぜ。 ここに書いた実装は、ダイナミックローディングが完了する前にmallocが呼ばれたらstaticに確保したメモリから切り出して返してる。 ウェブで検索しても見当たらなくて、割と悩んでこのやり方にたどり着いたんだが、今検索したら同じことやってるページが複数ある。収斂進化ってヤツか。 #include stdlib.h #include dlfcn.h static void * (* ext_malloc)(size_t) = NULL; static void (* ext_free)(void *) = NULL; static int offset = 0; static char buffer[256]; void * malloc(size_t size) { if (ext_malloc ext_free) { return ext_malloc(size); } void * ptr = buffer[offset]; offset += size; if (sizeof(buffer) offset) { // make the buffer bigger when this happens. exit(2); } return ptr; } void free(void * ptr) { if (buffer = (char *) ptr (char *) ptr buffer + sizeof(buffer)) { ext_free(ptr); } } int main(int argc, char * * argv) { void * libc = dlopen("libc.so.6", RTLD_LAZY); if (! libc) { exit(1); } ext_malloc = (void * (*)(size_t)) dlsym(libc, "malloc"); ext_free = (void (*)(void *)) dlsym(libc, "free"); // do whatever you want! ext_malloc = NULL; ext_free = NULL; dlclose(libc); return 0; }
https://w.atwiki.jp/m1000/pages/209.html
<<メモリ管理 ALLOC メモリ領域を確保する 構文 a = ALLOC(size ) パラメータ size 戻り値 指定サイズを確保したメモリ領域の先頭アドレス 確保できない場合は0 詳細 指定したサイズの大きさでメモリ領域を確保して、その先頭アドレスを取得する。 ALLOCコマンドで確保したメモリ領域は必ずFREEALLOCコマンドで開放すること。 OPL掲示板
https://w.atwiki.jp/avernum/pages/1822.html
位置 Midori Province、Lake Tomor南西、Lorelei及びBengaroと川を挟んだ対岸 解説 川岸の小さな町。 シナリオ登場時には、周辺を荒らすゴブリンの被害に悩まされていた。 居住・滞在するNPC Avernum3 Mrrrr 訓練所 トレーナー Mia 宿屋酒場 市民 Merry 商店 商人(よろず) この他に名前不明の宿屋の主人がいる。 以下の人物は時々(おそらくランダムに)登場する。 Foxfire 街路 吟遊詩人 備考