お世話になります。
VS2013 VC++ で作業中です。
アーカイブをするように言われて、zlibをサイトから落としてきてWin32スタティックラ
イブラリでコンパイルするために、c->cppに変更してプロジェクトに追加してコンパイル
をすると、大量のエラーが発生しました。(100個以上のエラーが存在するという事でコ
ンパイルが途中で止まってます)
一番目につくのが関数の引数の書き方です。
local void gen_codes (tree, max_code, bl_count)
ct_data *tree; /* the tree to decorate */
int max_code; /* largest code with non zero frequency */
ushf *bl_count; /* number of codes at each bit length */
{
という書き方でエラーがでています。
存在する関数全てを書き直すのは苦行です。
VisualStudio の設定などで回避できないでしょうか?
zlibはいろいろな人がWindowsでも使っているようなのですが、この問題についてはネッ
トで見かけません。
対応策をご存知でしたら教えていただけますようお願いします。
その記述は旧式の C の仕様で C++ では認められていないからエラーになって当然。
C なら認められている。
> c->cppに変更して
なんでそんなことするの? C のままコンパイルすれば良いぢゃん。
ってか zlib-1.2.8/contrib/vstudio 以下にプロジェクトファイルがあるので
それそのまま流用すると面倒なさそうな気がする。
>tetrapod さま
回答ありがとうございます。
ネットでzlibを使う方法のサイトを見てそのまま実現しようとした為です。
わざわざcppにするようにと書いてありましたので、その手順で実現しようとしました。
Cのままコンパイルしてみることにします。
C:\zlib-1.2.8\contrib\vstudio\vc11
のコードをコンパイルしてみたりもしましたが、できた結果をどのように使えば良いのか
わからなくて(zlib.libが無いし)利用を諦め、とにかくネットでzlibを組み込んで(DLL
無しでexeだけで動くようにしたい)圧縮(フォルダ指定か指定したファイルを全て)・
解凍する事が書いてあるサイトを探しまくっている状態です。
何か良いサンプルがあったら教えていただきたいです。
よろしくお願いします。
他人の作ったプロダクトは DLL にしておくと良い・・・とオイラは思うぞ。
バグとか脆弱性対応とかがあっても、末端ユーザが DLL だけ更新すればOKなわけで。
自分のプロダクトに静的に zlib を組み込んぢゃうと
zlib のセキュリティ更新の度に自プロダクトも更新再配布が必要になるし・・・
DLL ならコンパイル済みバイナリが配布されているのでダウンロードするだけだ。
Visual Studio 2005 で
Win32 プロジェクト→スタティックライブラリ、プリコンパイルヘッダなしでプロジェクト作る
展開した zlib-1.2.8 直下にある全ての .c と .h を追加
ビルド
だけで、とりあえずウチではさっくり static library できたけど(使ってないが)
警告 C4996 はガン無視で
# ./configure するとダメ
# test 以下のファイルは追加しちゃダメ
使うほうはお任せで。
http://saj.co.jp/techinfo/htmls/other-zlib-install_windows_precompile.html
この方法でダウンロードすれば、*.lib,*.h,*.dllが手に入るから、
そのまま使えばいいのでは?
たぶんtetrapodさんが言っている方法だと思います。
>tetrapodさま、ITOさま
ありがとうございます。
VS2013 VC++ Win32プロジェクト→スタティックライブラリで作成したプロジェクトに、
c,hファイルを追加してコンパイルしました。
c扱いでコンパイルしてzlib.lib は作成できました。(ワーニングは出ましたが)
このタイトルのままzlibの話を続けていいのかな。
VS2013 VC++ Win32 コンソール で作成したプロジェクト配下に、作成した
zlib.lib をコピーぢ、プロジェクト名上(右クリック)→追加でプロジェクトに入れる
(でいいのでしょうか(汗))
zlib.h, zconf.hをプロジェクト配下にコピーして、zlib.hだけインクルード
main()で Compress2()メソッドを書いてみると、定義が見つからないといわれ…で現在止
まっています。
VSを使い始めてそろそろ1年なのですが…使い方がまだまだ分かっていません。
とにかくEXEだけで動くようにしろと言われているのでDLLをリンクして使うという方法は
とれません…。
とりあえず Compress2() という zlib 関数は無いので当たり前。
C/C++ は大文字小文字を区別する仕様なので compress2() と Compress2() は違うもの。
zlib.h zconf.h の使い方はそれで OK
オイラんとこでは
zlib.lib を「プロジェクトのプロパティ→リンカ→入力→追加の依存ファイル」に追加
としてリンクまでは通った。実行はしてない。
プロジェクトのプロパティは Debug と Release (および追加してれば x64 等) があるので
zlib.lib は全部の構成に適切なものを追加する必要がある。
コンソールアプリケーション側の
Debug 構成には zlib の Debug 版
Release 構成には zlib の Release 版
を追加しておくとデバッグがはかどったり性能が出たりするだろう。
ってかコンソールアプリケーション自体に 11:11:43 の手順で zlib のファイルを追加しちゃ
え。
そのほうが簡単かも。
>tetrapod様
コンソールアプリ(メインプロジェクト)に、zlib関連のh.cを入れてしまえという事で
しょうか?そうすればlibなど外部要素を取り込む必要無く、zlib関係の関数が使えると
いう理解で良いのでしょうか?
それはさておき、Compress2()という関数名、コードを打っていてcomまで打ったら出てき
た候補関数名から選んでそのまま使ったつもりだったのですが、今、もう一度見直してみ
たらCompress2()でなくてcompress2()でした。
どこでどう間違えてcがCになってしまったのか…。
とりあえずこの方法でまた進めてみます。
libのコンパイルもDebugモードで作ったのを使ったほうがよさそうですね。
今のところReleaseモードのみ作って入れてます。
アドバイスありがとうございます。
> コンソールアプリ(メインプロジェクト)に、zlib関連のh.cを入れてしまえ
御意
> 外部要素を取り込む必要無く、zlib関係の関数が使える
> という理解で良いのでしょうか?
御意
static library を追加した場合の pro/con
zlib 中の未使用の関数はメインプロジェクト中にはリンクされない
ので EXE のサイズが小さい(と思うが未確認)
LIB と EXE のコンパイルオプションが違うと異常動作する
ソース丸ごと取り込んだ場合の pro/con
zlib 中の未使用の関数もメインプロジェクト中にリンクされる(かもしれない未確認)
ので EXE のサイズが若干大きくなる(かもしれない)
コンパイルオプションが必ず同じになるので異常動作しない
VC++ のコンパイルオプション /MT /MD 系は混在させるとダメなの有名なので。
>tetrapod さま
アドバイスありがとうございます。
現状では、自分で作ったlibをスタティックリンクしてやる方法で作る予定です。
libができたというのに、compress() compress2()の使い方がいまいちよくわからなく
て、この作業は停止してる状態です。(解凍試験もしなくてはならないのに)
関数の説明を読んでも何をどう引数にしてるのか理解できない低脳さ…。
質問内容がタイトルからずれたので、これはクローズします。
tetrapodさま、ITOさま ありがとうございました。