コマンドラインから VC++ を使う方法はご存知でしょうか?
VC98\BIN ディレクトリに vcvars32.bat が生成されているので、
開いたコマンドライン窓中からこれを実行すると
PATH 等環境変数がセットされます。そのあとでなら
nmake が使えるはず。
unix-like make (GNU make) と Microsoft NMAKE は
似て非なるものなので nmake 用 makefile を gnu make で
使うことはできません。
ということで試してみてください。
RGB->BRG 順の変更とは jmorecfg.h の RGB_RED のところの変更。
makefile.vc の -MT 追加
他は IJG の配布ファイルのままでライブラリのコンパイルは
通りました。そのライブラリを使うとこまでは試してませんが...
おっと見落とし
-I-MT.
とマジに書いたのなら間違い。
-I. -MT
としなければなりません。マニュアル読むべし。
tetrapodさんできました!!
感謝感激です。
有難うございます。
最後に聞きたいのですが
>自作コードのほうは
>extern C {
>#include jpeglib.h
>}
上記のコードは何ですか?
私は実行しなかったです。
物凄く気になるのでよろしければ教えてください。
えーと、チェーンが長くて情報が分散しているのでちょっとまとめてみました。
MFC を使ったアプリケーションで libjpeg.lib を使おう!
1.ライブラリの構築
http://tanack.hp.infoseek.co.jp/libjpeg.html
の手順そのままは個人的にはお勧めしません。
少なくとも cpp にリネームする項目だけは避けて欲しい。
ライブラリ構築は IJG の配布したものに最低限の修正だけで行うべし。
1-a.jmorecfg.h の修正を行う (RGB->BRG 対応のみ) 。
1-b1.makefile.vc の修正を行う
CFLAGS= の行の末尾に -MD を追加し、ライブラリ構築。
これで出来たライブラリを libjpeg.lib としてどこかにコピー。
1-b2.makefile.vc の修正を行う2
CFLAGS= の末尾の -MD を -MDd にしてライブラリ再構築
これで出来たライブラリを libjpegd.lib としてどこかにコピー。
2.libjpeg.h の MFC 対応
上記 webpage の jconfig.h 修正分を当てるとOK。
3.MFC プロジェクトの設定
ライブラリの追加・ヘッダパスの追加を行う。このとき
デバッグ構成のほうは libjpegd.lib を追加し
リリース構成のほうは libjpeg.lib を追加する
と、リンク時警告が出なくてGOOD。
4.MFC プロジェクトソースの設定
jpeg を扱う cpp ソースコードには
extern C {
#include jpeglib.h
}
を追加。追加個数が多いようなら stdafx.h に追加。
かな?だれぞフォローお願い。
extern C なしでリンク成功ということは、
せんべいさんのところでは .c を .cpp にリネームして libjpeg.lib を
構築し、そのライブラリを使ったはずです。そうでないと必ずエラーになります。
今お使いのその libjpeg.lib は C ソースから呼べなくなっています。
一度上記に書いた手順でもう一度ライブラリ構築してみてください。
extern C はまあ、おまじないというかなんと言うか。
C++ ソースコードから C で作った関数を呼ぶときに必要
C++ ソースコード中に C から呼べる関数を作るときに必要
な,おまじないです。
詳細は name mangling などで検索掛けてみてください。
jpeglib は C のソースコードなので MFC アプリのような C++ ソース
から C 関数を呼びたい訳で extern C は必須です。
先の発言では -MT と書いちゃいましたが MFC 前提ということなら -MD の
方が正しいです。で、リンク時に警告が出るので -MD と -MDd を使い分ける
のが適切です。
いろいろとアドバイス有難うございました。
本当に感謝感激です。
>extern C なしでリンク成功
おっしゃるとおりでした。
>-MT の件
2.CFLAGS= $(cflags) $(cdebug) $(cvars) -I-MT
このままでもコンパイルができました。
そしてそのライブラリを用いてimgsave(DLしたサンプル)を実行できます。
これはとても不思議です。
extern Cで囲むと言うのは、
関数のエクスポート名の命名規約をCで行うと言う意味です。
Cにはクラスとか関数の多重定義と言う機能が無いので関数をライブラリの外部から
参照するときの名前とコーディング上の関数名の記述がほとんど同じなんですが、
C++だと上記の概念があるので関数名に色々と修飾が付きます。
ソースの拡張子をcppに替えてしまうとC++のソースとしてコンパイルされてしまうので
関数のエクスポート名がC++の命名規約を使って行われてしまい、
Cのつもりで表記していると名称があわないためにリンクで失敗します。
C++のソース扱いでコンパイルしているときにその関数の命名規約を強制的に
Cのもので行うためにextern Cを使用します。
VCのHELPにこの辺の話が載っていたと思います。
extern Cに関連する項目から探してみてはいかがでしょうか?