jpegの処理について – 固定ページ 3 – プログラミング – Home

通知
すべてクリア

[解決済] jpegの処理について

固定ページ 3 / 3

tetrapod
 tetrapod
(@tetrapod)
ゲスト
結合: 22年前
投稿: 830
 

コマンドラインから 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 の配布ファイルのままでライブラリのコンパイルは
通りました。そのライブラリを使うとこまでは試してませんが...


返信引用
tetrapod
 tetrapod
(@tetrapod)
ゲスト
結合: 22年前
投稿: 830
 

おっと見落とし
-I-MT.
とマジに書いたのなら間違い。
-I. -MT
としなければなりません。マニュアル読むべし。


返信引用
せんべえ
 せんべえ
(@せんべえ)
ゲスト
結合: 22年前
投稿: 20
Topic starter  

tetrapodさんできました!!
感謝感激です。
有難うございます。
最後に聞きたいのですが
>自作コードのほうは
>extern C {
>#include jpeglib.h
>}
上記のコードは何ですか?
私は実行しなかったです。
物凄く気になるのでよろしければ教えてください。


返信引用
tetrapod
 tetrapod
(@tetrapod)
ゲスト
結合: 22年前
投稿: 830
 

えーと、チェーンが長くて情報が分散しているのでちょっとまとめてみました。

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 に追加。

かな?だれぞフォローお願い。


返信引用
tetrapod
 tetrapod
(@tetrapod)
ゲスト
結合: 22年前
投稿: 830
 

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 を使い分ける
のが適切です。


返信引用
せんべえ
 せんべえ
(@せんべえ)
ゲスト
結合: 22年前
投稿: 20
Topic starter  

いろいろとアドバイス有難うございました。
本当に感謝感激です。

>extern C なしでリンク成功
おっしゃるとおりでした。
>-MT の件
2.CFLAGS= $(cflags) $(cdebug) $(cvars) -I-MT
このままでもコンパイルができました。
そしてそのライブラリを用いてimgsave(DLしたサンプル)を実行できます。
これはとても不思議です。


返信引用
PATIO
(@patio)
Famed Member
結合: 4年前
投稿: 2660
 

extern Cで囲むと言うのは、
関数のエクスポート名の命名規約をCで行うと言う意味です。

Cにはクラスとか関数の多重定義と言う機能が無いので関数をライブラリの外部から
参照するときの名前とコーディング上の関数名の記述がほとんど同じなんですが、
C++だと上記の概念があるので関数名に色々と修飾が付きます。
ソースの拡張子をcppに替えてしまうとC++のソースとしてコンパイルされてしまうので
関数のエクスポート名がC++の命名規約を使って行われてしまい、
Cのつもりで表記していると名称があわないためにリンクで失敗します。
C++のソース扱いでコンパイルしているときにその関数の命名規約を強制的に
Cのもので行うためにextern Cを使用します。

VCのHELPにこの辺の話が載っていたと思います。
extern Cに関連する項目から探してみてはいかがでしょうか?


返信引用
固定ページ 3 / 3

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました