nDiki : Visual C++

2001年6月7日 (木)

13:15 Visual C++ + 日本語 EUC

gcc でコンパイルできるコードを Visual C++ でコンパイルすると namespace 辺りでエラー。 うーんうーん。 半時間以上たって、判明したのはソース中の日本語 EUCによる問題。 Linux で書いていたコードをとりあえず持ってきて make していたので...

泣き。

スポンサード リンク

14:30 GNU Autotools + Visual C++

投げ。とりあえず nmake 用 Makefile を書いてお茶をにごす。

[ 6月7日全て ]

2001年9月18日 (火)

18:20 Visual C++ IDE のメニュー

ビルド」メニューで、「ビルド」と「リビルド」が並んでいる。 「ビルド」を選択するつもりで「リビルド」を選択してしまうと……コーヒータイムだ。

とはいえ、時間がもったいないので「リビルド」をメニューから削除した。

[ 9月18日全て ]

2001年9月21日 (金)

14:45 Crypto++

以前チェックしていたフリーの C++ 暗号化クラスライブラリ。 gzip や zlib 圧縮もサポート。 MSVC 6.0 でも OK。 ちょっと、使って見ようかなと。

使い方は、Read denis bider の User Guide がよさそげ。

[ 9月21日全て ]

2004年2月19日 (木)

[ Perl ] PDL::PP で C extension を書く

PDLを使ったPerl数値処理プログラムによりインタラクティブ性が求められるようになってきたので、一部をCで書いて高速化する事を検討。 問題は Linux でも Windows + ActivePerl でもすんなり動くかどうか。

.pd ファイルを書く

とりあず PDL::PP のサンプルから sumit 関数あたりを MathEx.pd に書いておく。

Makefile.PLを修正する

Foo::Bar パッケージの中の Foo::Bar::Math の一部を Foo::Bar::MathEx に移して、C extension 化したい。 ということで lib/Foo/Bar/MathEx.pd として、Makefile.PL の各種設定をしてみる。

がどうもうまくいかない。 PDL::PPMakefile.PLサポートは、Makefile.PL と同じ位置に .pd がある事を想定しているようなので、いろいろと小細工をしなければならない。 一方 PerlXS は Foo::Bar のベース名から Bar.so を作る前提になっているようで、これまたパッケージの中の一部のモジュールをどうもXS化しにくい。

Makefile.PLを作る

Perl の ext/SDBM_File を真似て、子 Makefile.PL を使ってみることにした。

 Foo-Bar-x.xx
   |
   +- Makefile.PL
   |
   +- lib
   |    |
   |    +- Foo
   |         |
   |         +- Bar.pm
   |         |
   |         +- Bar
   |              |
   |              +- Math.pm
   |              |
   |              +- MathNoEx.pm
   |              |
   |              ...
   |
   |
   +- blib/...
   |
   +- MathEx
   |    |
   |    +- Makefile.PL
   |    |
   |    +- MathEx.pd
   ...

パッケージディレクトリの下に MathEx ディレクトリを作り、そこに Makefile.PL と MathEx.pd を置く。 Makefile.PL は MathEx.pd 専用になるので、PDL::PP の標準的なものでOKになる。

全体のパッケージング・PPM化・インストール等が面倒にならないかと心配したが、Foo-Bar パッケージ化で perl Makefile.PL、make xxx を実行すれば子Makefile.PLまできちんと面倒をみてくれる。 MathEx 以下でビルドしたものもパッケージの blib に一緒に入れてくれるし(=一緒にインストールできる・PPM化できる)。 逆に make dist の際には子Makefileの方は余計なとりまとめはしないで、親Makefileが一括して tar.gz に入れてくれる。 これはよい。 MathEx.pd もきちんと Foo/Bar/MathEx.so になった。

XSが使えない環境との両対応

XSが使えない環境のために、PerlとPPの両方で関数を書いておく。 XSが使えれば MathEx を、使えなければ MathNoEx.pm を使うように。 表向きのAPIは Foo::Bar::Math とし、ここで AUTOLOAD を使ってどちらか一方を呼び出すようにする。 間接呼び出しにして遅くなるのはいやなので、シンボルテーブルを直接設定する。

 use vars qw($IMPLEMENT_CLASS $AUTOLOAD);
 BEGIN {
   $IMPLEMENT_CLASS = 'Foo::Bar::MathEx';

   eval "use $IMPLEMENT_CLASS";
   if ($@) {
     warn "Can't load $IMPLEMENT_CLASS: $@";
     $IMPLEMENT_CLASS = 'Foo::Bar::MathNoEx';
     eval "use $IMPLEMENT_CLASS";
     die $@ if $@;
   }
 }

 sub AUTOLOAD {
   my $name = $AUTOLOAD;
   $name =~ s/.*://;
   my $implement = $IMPLEMENT_CLASS . '::' .$name;
   no strict "refs";
   *{$name} = \&{$implement}; # ここでシンボルテーブル設定
   return &{$implement}(@_);
 }

最初は、AUTOLOAD の最後の行で die したら、trap してエラーメッセージ中のパッケージ名(Foo::Bar::MathEx や Foo::Bar::MathNoEx)を呼び出された Foo::Bar::Math に置換して die し直すようにしようかと思ったが面倒なのでやめ。

ActivePerl 5.6 + Visual C++ 6

使っているWindows BOX には Visual C++ 6 が入っているので、XSも問題なくビルドでき PDL extension もうまく動いた。

 PPM化までここで済ませば、他のPCにも持っていけるはず。

さて

これでバシバシPPで書けるわけだが、PPがこれまた難解で最初は苦労しそう。

[ 2月19日全て ]

2004年8月27日 (金)

Wx::ActiveXビルド

Wx::ActiveXPerl 5.6.1 用バイナリ(PPM パッケージ)が配布されていないのでビルドする。 最初はPPM パッケージ化された wxPerl (Wx-0.19-wxmsw2.4.2-win32-u-5.6.1.zip) と wxWidgets 2.4.2 で作成しようと思ったが、うまくいかないので全部ビルドすることに。

wxWidgetsインストール

wxMSW-2.4.2-setup.zip を C:\usr\local\wxWindows-2.4.2 へ。

wxPerl 0.20

ドキュメントの通り、wxWidgetsビルド後、モジュールを作成。 コンパイルには Visual C++ 6 を使用。

wxWidgetsビルド

 set WXWIN=C:\usr\local\wxWindows-2.4.2
 set WXDIR=C:\usr\local\wxWindows-2.4.2
 cd %WXDIR%\src\msw
 nmake -f makefile.vc FINAL=1 dll
 cd %WXDIR%\contrib\src\stc
 nmake -f makefile.vc FINAL=1 WXUSINGDLL=1
 cd %WXDIR%\contrib\src\xrc
 nmake -f makefile.vc FINAL=1 WXUSINGDLL=1

Wx-0.20.tar.gz を展開したディレクトリに移動し(WXWIN, WXDIR は前記と同じように設定したまま)、

  perl Makefile.PL
  nmake
  nmake test
  make_ppm

PPM パッケージ化まで。

Wx::ActiveX 0.05

先に wxPerlインストールしておいてから、

 set WXWIN=C:\usr\local\wxWindows-2.4.2
 set WXDIR=C:\usr\local\wxWindows-2.4.2
  perl Makefile.PL
  nmake
  nmake test
  make_ppm

PPM パッケージ化。インストール

demo ディレクトリにあるサンプルで、IE、Flash Player、Acrobat、Windows Media Player を貼りつけられていることを確認。

[ 8月27日全て ]

2008年9月8日 (月)

今日のさえずり: 今日はノート PC を会社に置いてきた。人間的な生活をおくろう

2008年09月08日

  • 09:19 NEW MEGALOPOLIS で出勤中。空いている電車で良かった。[mb]
  • 09:42 アイス カフェモカ トール パーソナル。[mb]
  • 10:39 c:\Documents and Settings\naney\Application Data\Ripplex を削除。
  • 11:37 Google ドキュメント、書き込み禁止設定できるようにならないかな。freeze したドキュメントは自分でも誤って編集したりしないようにしたいのだが。
  • 11:38 @zakwa Windows XP SP3 がきてるんじゃない?
  • 12:17 mixi のエコー利用停止した。停止するのにアンケート必須って何考えてるん?
  • 12:49 @odeko_O mixi エコー、見なくてもいい人のが見えてしまうのがダメでした (そんな人マイミクシィから外せばというのも無くはないのですが)。
  • 13:28 Visual C# 2008 Express Edition をインストールするつもりが間違えて、Visual C++ 2008 Express Edition のインストールを始めていた。あわててキャンセル。
  • 18:12 Visual C# 2008 Express Edition 登録しようとしたら Windows Live ID へのサインインを求められた。(多分)2001年頃の Microsoft Passport のパスワード入れてみたけどはねられた。
  • 18:16 と思ったら、メモの下に「new password」が。もうパスワード再設定始めてるけど。
  • 18:54 目の前にあるエアコンのスイッチが切られていることを、Twitter のログでようやく気がつくオレって……。
  • 20:06 今日はノート PC を会社に置いてきた。人間的な生活をおくろう。[mb]
  • 21:04 ギリギリ雨降る前に家に帰って洗濯物取り込めた。ラッキー。[mb]
  • 21:18 ザーッときた。朝の天気予報では「にわか雨は一部の地域のみ」と言っていたが、ここはその一部なのか。結局降られる時は降られるから「一部」とかって予報は個人には意味ないな。[mb]
  • 21:43 ミニ万年筆「WHITE」付録ラピタもう1冊買ってきた。[mb]
  • 21:47 ちなみに箱は思いっきり潰されてた。やるな LABI。[mb]
[ 9月8日全て ]

2011年2月21日 (月)

Visual C++ Win32 コンソールアプリケーションへのメモリリーク検出の埋め込み

Visual C++ 2005 で開発のプログラムがどうもメモリリークしているっぽい。 メモリリーク検出を仕込む方法のメモ

stdafx.h

デバッグバージョンのヒープ割り当て関数を使うようにするマクロ定義と crtdbg.h のインクルードをする。 メモリリーク情報ダンプの際にレポートにファイル名と行番号が出るように new を書き換えるマクロを定義する。

 // デバッグバージョンのヒープ割り当て関数を使うようにする。
 #ifdef _DEBUG
 #define _CRTDBG_MAP_ALLOC
 #include <stdlib.h>
 #include <crtdbg.h>
 #endif

 // _CRTDBG_MAP_ALLOC に関係なくプリコンパイルしたいもの。
 // かつ new を書き換えるとコンパイルが通らなくなるヘッダファイル群。
 #include <string>

 #ifdef _DEBUG
 // プリコンパイルするほどではないけど、
 // new を書き換えるとコンパイルが通らなくなるヘッダファイル群。
 // 例えば。
 #include <map>

 #define new new(_NORMAL_BLOCK, __FILE__, __LINE__)
 #endif

 // プリコンパイルしていもの。
 #include <myproj/utility.h>

main 関数

終了時にメモリリーク情報をダンプさせるようにする。 また、コンソールアプリケーションの標準エラー出力にレポートが出力されるように設定する。

 int main(int argc, char* argv[]) {
   // 終了時にメモリリーク情報をダンプさせる。
   _CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF);


   // レポートをファイルに書き出させる。
   _CrtSetReportMode(_CRT_WARN, _CRTDBG_MODE_FILE);
   _CrtSetReportMode(_CRT_ERROR, _CRTDBG_MODE_FILE);
   _CrtSetReportMode(_CRT_ASSERT, _CRTDBG_MODE_FILE);

   // レポートを標準エラー出力に出力させる。
   _CrtSetReportFile(_CRT_WARN, _CRTDBG_FILE_STDERR);
   _CrtSetReportFile(_CRT_ERROR, _CRTDBG_FILE_STDERR);
   _CrtSetReportFile(_CRT_ASSERT, _CRTDBG_FILE_STDERR);

   // 処理を開始。
   ...
 }
[ 2月21日全て ]

About Me

Naney Naney (なにい)です。株式会社ミクシィでマネージャー・プロダクトオーナーをしています。

nDiki1999年1月に始めたコンピュータ日誌を前身とする NaneyWeb 日記(兼パーソナルナレッジベース)です。ちょっとしたノートは nNote にあります。

follow us in feedly

※内容は個人的見解であり所属組織とは関係ありません。

月別インデックス
Process Time: 0.05224s / load averages: 0.67, 0.64, 0.58
nDiki by WATANABE Yoshimasa (Naney, Google profile)
Powered by DiKicker