環境:Win2k SP4、 VC++6.0
画像処理ソフトを作っていて、libjpegのコンパイルは出来たのですが、
どうもlibpngのライブラリ生成が上手く行ってないようで、
色々検索して調べてみたのですが、どうも上手く行きません。
自分でもどこがどう悪いのかが分かりません・・・。
落としてきたのは1.2.8のソースです。見つけた情報とファイル等は古いせいかコンパイルが出
来ません。
ちなみに、バイナリ(?)があったので、それを利用し、ビルドまで出来たのですが、
( http://gnuwin32.sourceforge.net/packages/libpng.htm [Developer files])
今度は実行時に「LIBPNG13.DLLが見つかりません」とエラーが出ます。。
PNG入出力を扱ってるソフトでDLLが同梱されてるのを観た事が無いので、
やはり自分でコンパイルしてみないと駄目なんでしょうか?
落とした1.2.8ソースのScriptsフォルダのワークスペースからのビルドでは駄目でした。
zlibも入手しましたか?
libpng単体ではコンパイルできませんよ。
はい、zlibも落としまして、こちらはすんなりコンパイル通りました。
その後、libpng1.2.8のScriptsフォルダにあるmakefile.mscをソースディレクトリに入れ
て、
zlibフォルダとライブラリも同じ所に移動してメイクしてみましたが駄目でした・・・。
>コマンド ラインの警告 D4002 : 認識不可能なオプション '-AL' を無視しました。
>NMAKE : fatal error U1077: 'cl' : リターン コード '0x2'
のようにエラーが出ます。
何か、makefileの編集など必要なのでしょうか・・・?
makefile.msc は太古の MS-DOS 用 Microsoft-C 5.1 用だと書かれています。
-AL ってのが Large Model つまり 16bit MS-DOS 用コンパイルオプションだし。
どうせやるなら scripts\makefile.vcawin32 を使いましょう。
d:\libpng-1.2.8 ディレクトリにて
copy scripts\makefile.vcawin32 makefile
makefile を編集 -I..\zlib を適切なディレクトリに変更
(例えば -I..\zlib-1.2.2 とか)
nmake
でうまくいくと思われます。
レスありがとうございます。
言われた通り、makefile.vcawin32にして、ディレクトリを編集したら上手く行きました。
しかし、ちょっと気になるのですが、自分が拾ってきたlibよりも容量が4倍くらいあるのと、
コンパイルの最後の方で
> del libpng.lib
>E:\MyProjects\lpng128\libpng.lib が見つかりませんでした。
と言う風に出ます。けれど、一応ちゃんとlibpng.libは生成されました。
試しに、今まで使ってたのと入れ替えてビルドしてみたところ、
リンク時に外部シンボル~は未解決です。のエラーが出ました。。
>libpng.lib(png.obj) : error LNK2001: 外部シンボル _inflateReset は未解決です
一度クリーンしてから、元に戻したらエラーは全く出ませんでした。
> del libpng.lib
makefile にそう書かれているので
>E:\MyProjects\lpng128\libpng.lib が見つかりませんでした。
と表示されるのは仕方ないでしょう。気にしなくていいです。
>一度クリーンしてから、元に戻したらエラーは全く出ませんでした。
一度作成失敗してますからね。クリーンしてやり直して正解です。
>自分が拾ってきたlibよりも容量が4倍くらいあるのと、
ウチで作った libpng.lib は 318320bytes となりました。
デバッグ情報を削除したら 133540bytes となりました (cygwin strip 使用)
リンクできるように戻すと 296044bytes となりました (cygwin ranlib 使用)
ダウンロードしてきた lib は実はインポートライブラリかもしれません。
インポートライブラリなら中身は無いのでサイズは小さくて当然です。
あまり深くキニシナイほうがよさそうです。
レスありがとうございます。
一応出来たのはいいんですが、ヘッダファイル等をディレクトリに入れて
png.hをインクルードしても上述の通り、
>リンク時に外部シンボル~は未解決です。のエラーが出ました。。
となるんですよね・・・。その点、インポートライブラリはlibpng13.dllがありませんという
だけで、コンパイルは通ります・・・。
どうすればよいでしょうか・・・?
回答ではありません
HN名「Nemo」と「masa」は同一人物でしょうか?、同一人物なら統一してください
すいません、たまたま同じIDを使ってしまいました。
Nemoです。紛らわしいことしてすいません。
未だ、リンク時の外部シンボル未解決エラー出ます。
当然ながら zlib.lib はリンクしてあるのですよね?
inflate*** は libpng ではなく zlib の関数です。
インポートライブラリを使えば、実行時 DLL を探しに行くだけです。
開発環境に DLL インストール済みだったらエラーにならないし、
客先に DLL がなかったら実行時エラーになるだけの話。
ゆう様のコメントでわかっているとばかり思いましたが...
すいません、zlibはlibpng.libコンパイル時のみ必要かと思ってました。
リンクでzlib.libを入れたら、上述のリンクエラーは出なくなりましたが、今度は
MSVCRT.lib(MSVCRT.dll) : error LNK2005: _sprintf はすでに LIBCD.lib
(sprintf.obj) で定義されています
MSVCRT.lib(MSVCRT.dll) : error LNK2005: _strncpy はすでに LIBCD.lib
(strncpy.obj) で定義されています
MSVCRT.lib(MSVCRT.dll) : error LNK2005: _fflush はすでに LIBCD.lib(fflush.obj)
で定義されています
MSVCRT.lib(MSVCRT.dll) : error LNK2005: _malloc はすでに LIBCD.lib(dbgheap.obj)
で定義されています
MSVCRT.lib(MSVCRT.dll) : error LNK2005: _free はすでに LIBCD.lib(dbgheap.obj) で
定義されています
LINK : warning LNK4098: defaultlib MSVCRT は他のライブラリの使用と競合していま
す; /NODEFAULTLIB:library を使用してください
Debug/Gradiator.exe : fatal error LNK1169: 1 つ以上の複数回定義されているシンボルが見
つかりました
という風に出ました。
インポートライブラリというのは プロジェクトの設定 で リンク 一般の
オブジェクト/ライブラリモジュール と言うところにライブラリファイル名を入れればいいんで
すよね・・・?
ソースの方には
#include png.h
#pragma comment(lib, libpng.lib)
としか記述してませんが。
度々すいません、インポートライブラリとはDLL内の関数を呼び込むものですね。
しかし、libpng13.dllを探さずに、客先にDLL無しで創りたいということでした。
どうやら、コンパイル済みの小さいファイルはインポートライブラリだったせいで、
実行時にDLLが見つからないエラーになったのですね。
基本的な事が分かってないようでした。すいません。。
LNK2005 はライブラリの不整合から発生します。
VC++6 においては、ライブラリが8種類存在し、それぞれ
デバッグ有無・シングル/マルチスレッド・静的/動的 の違いがあります。
うまく動かそうとするには、8種のうちの適切な1つを選ばなければなりません。
さて zlib をうまくコンパイルできていれば、上記8種類のライブラリのうち
4種類が生成されているはずです(シングルスレッドモデルは生成されない)
# アセンブラを使った高速モデル/C だけの中速モデルがあるので8種生成されていますが
# 両者に本質的違いは無いので、実質4種類。
Nemo さんがどれをつかいたいかによって、使うべきライブラリを選んでください。
Win32(MFC)アプリケーション+静的結合、を使いたいと推測されるので
・Win32_LIB_Release(Win32_LIB_ASM_Release) を Release 構成で使用する
・Win32_LIB_DEBUG(Win32_LIB_ASM_Debug) を Debug 構成で使用する
・アプリケーションプログラムのほうをマルチスレッド構成にする
の3点でうまくいきそうな気がします。
一応、Releaseモードでの生成は上手く行っていると思うんですが、
どうも上に書いたような再定義エラーを幾つか吐きます。また1種類しか生成されません。
「アクティブな構成の設定」で設定したモードのライブラリのみを生成しました。
Win32_LIB_Release でマルチスレッドにしてビルドすると400KB弱にもなりました。(そんなも
のなのかな??)
ASMでは
>'ml' は、内部コマンドまたは外部コマンド、
>操作可能なプログラムまたはバッチ ファイルとして認識されていません。
>c:\winnt\system32\cmd.exe の実行エラー
と、ビルド出来ませんでした。
ただし、makefile.vcawin32 を使ったメイクでは310KBのが生成されたのでこれを使ってます
が、同様のエラーは吐き出されます。
このエラーを避けるにはどうすればよいでしょうか。。
ちなみに、libpng.libでの静的結合したpng関連の関数を使わなければ、このエラーは吐きませ
んでした。
アプリケーションの方はマルチスレッドにしてみましたが同様でした。
>MSVCRT.lib(MSVCRT.dll) : error LNK2005: _malloc はすでに LIBCD.lib
(dbgheap.obj) で定義されています
>MSVCRT.lib(MSVCRT.dll) : error LNK2005: _free はすでに LIBCD.lib(dbgheap.obj)
で定義されています
>LINK : warning LNK4098: defaultlib MSVCRT は他のライブラリの使用と競合していま
す; /NODEFAULTLIB:library を使用してください
> /NODEFAULTLIB:library を使用してください
書いてあるまんまです。
/NODEFAULTLIB:LIBCD.lib
/NODEFAULTLIB:MSVCRT.lib
って書いてください。
またはライブラリを作る時にMFCの共有DLLを使用でも
いいかもしれません。