Visual C++ 2008 用に Cairo をコンパイルする方法 (Express エディション)
-
01-07-2019 - |
質問
プリコンパイルされた Windows バイナリのほとんどは、MSYS+gcc ツールチェーンを使用して作成されます。MSVCRT ランタイムを使用しますが、Visual C++ 2005/2008 とは互換性がありません。
では、Visual C++ 専用に Cairo 1.6.4 (またはそれ以降) をコンパイルする方法を説明します。依存関係 (png、zlib、pixman) を含みます。
解決
ここでは、Visual C++ を使用して Cairo/Cairomm をビルドする手順を説明します。
必須:
- Visual C++ 2008 Express SP1 (SDK が含まれるようになりました)
- MSYS 1.0
VC++ コマンド ライン ツールを使用するには、バッチ ファイル「vcvars32.bat」を実行する必要があります。
C:\Program Files\Microsoft Visual Studio 9.0\Common7\Tools\vcvars32.bat
ZLib
から zlib123.zip をダウンロード (および抽出) します。 http://www.zlib.net/
cd zlib123 nmake /f win32/Makefile.msc dir # zlib.lib is the static library # # zdll.lib is the import library for zlib1.dll # zlib1.dll is the shared library
libpng
から lpng1231.zip をダウンロード (および抽出) します。 http://www.libpng.org/pub/png/libpng.html
VC++ 9.0 コンパイラは、「これは安全でない可能性があります」という警告を大量に出します。それらを無視してください。これは MS セキュリティ パニックです (コードは良好です)。
cd lpng1231\lpng1231 # for some reason this is two stories deep nmake /f ../../lpng1231.nmake ZLIB_PATH=../zlib123 dir # libpng.lib is the static library # # dll is not being created
ピクスマン
Pixman は Cairo の一部ですが、別個にダウンロードします。
pixman-0.12.0.tar.gz をダウンロード (および抽出) します。 http://www.cairographics.org/releases/
MSYS を使用して「tar -xvzf pixman*.tar.gz」で解凍します。
PixmanとCairoはどちらもVisual C ++コマンドラインコンパイラ(CL)用のメイクファイルを持っていますが、GNU MakeFileとUnixのようなツール(SEDなど)を使用しています。これは、MSYS内からメーカーを実行する必要があることを意味します。
VC++ コマンド ライン ツールを有効にしてコマンド プロンプトを開きます (「cl /?」を試してください)。「C:\MSYS\1.0\MSYS.BAT」によって、そのコマンド プロンプトを MSYS プロンプトに変更します。
MSYS アイコンは使用しないでください。MSYS アイコンを使用すると、プロンプトで VC++ が認識されるようになります。MSYS から .bat ファイルを実行することはできません。
ここから VC++ ツールが動作することを試してください。「cl-?」
Gnu make も機能することを試してください。「make -v」。
いいね。
cd (use /d/... instead of D:) cd pixman-0.12.0/pixman make -f Makefile.win32
これにより、新しいX86プロセッサ(Pentium 4またはPentium M以上)が必要なMMXおよびSSE2の最適化が必要です。 http://fi.wikipedia.org/wiki/SSE2 )
かなりの警告が出ますが、成功したようです。
ls release # pixman-1.lib (static lib required by Cairo)
Cairo もコンパイルできるように、VC++ のスパイスを加えた MSYS プロンプトに留まります。
カイロ
から cairo-1.6.4.tar.gz をダウンロード (および抽出) します。 http://www.cairographics.org/releases/
cd cd cairo-1.6.4
ここの Makefile.win32 はほぼ良好ですが、Pixman パスが固定されています。
変更した「Makefile-cairo.win32」を使用します。
make -f ../Makefile-cairo.win32 CFG=release \ PIXMAN_PATH=../../pixman-0.12.0 \ LIBPNG_PATH=../../lpng1231 \ ZLIB_PATH=../../zlib123
(バックスラッシュを無視して、すべてを 1 行に記述します)
「「src/cairo-features.h」を作成するルールはありません」と書かれています。手動で準備したものを使用します(カイロ> 1.6.4では、単純に名前を変更できる 'src/cairo-features-win32.h'がある場合があります):
cp ../cairo-features.h src/
make コマンドを再試行します (上矢印でそれが記憶されます)。
ls src/release # # cairo-static.lib
カイロム (C++ API)
から cairomm-1.6.4.tar.gz をダウンロード (および抽出) します。 http://www.cairographics.org/releases/
2008 用に (オープンおよびアップグレード経由で) 使用できる Visual C++ 2005 プロジェクトがあります。
cairomm-1.6.4\MSCV_Net2005\cairomm\cairomm.vcproj
行う必要がある変更:
アクティブな構成を「リリース」に変更します
Cairomm-1.0 プロパティ (右クリック メニュー)
C++/General/Additional Include Directories: ..\..\..\cairo-1.6.4\src (append to existing) Linker/General/Additional library directories: ..\..\..\cairo-1.6.4\src\release ..\..\..\lpng1231\lpng1231 ..\..\..\zlib123 Linker/Input/Additional dependencies: cairo-static.lib libpng.lib zlib.lib msimg32.lib
- 最適化:高速FPUコード
C++/Code generation/Floating point model Fast
「cairomm-1.0」を右クリックして「ビルド」します。いくつかの警告があります。
dir cairomm-1.6.4\MSVC_Net2005\cairomm\Release # # cairomm-1.0.lib # cairomm-1.0.dll # cairomm.def
他のヒント
これらの手順により、Visual Studio 2015 コミュニティ向けに 2015 年 11 月 15 日に最新の cairo をビルドできます。デバッグ ビルドは DLL であり、CRT の DLL バージョンにリンクしています。リリース ビルドは静的ライブラリであり、CRT の静的リンク バージョンにリンクしており、DLL は必要ありません。
GnuWin をインストールする
ビルド スクリプトには GNU コマンド ライン ツールが必要です。次の手順は次の方法でテストされます。 Chocolatey の GnuWin. 。MSYS も機能する可能性があります。
ダウンロード
zlib128.zip, lpng1619.zip, カイロ-1.14.4.tar.xz, pixman-0.32.8.tar.gz
抽出する
これらのアーカイブを抽出し、ディレクトリの名前を変更します。
. (my_cairo_build_root)
├─cairo
├─libpng
├─pixman
└─zlib
ズリブ
建てないでください。ビルド スクリプトは、Visual Studio 2015 と競合する MSVCRT を使用します。libpng ビルドから生成されたライブラリを使用します。
libpng
編集 libpng\projects\vstudio\zlib.props
:
- で
<ZLibSrcDir>
バージョン番号を削除します。..\..\..\..\zlib
- で
<WindowsSDKDesktopARMSupport>
変化true
にfalse
開ける libpng\projects\vstudio\vstudio.sln
Visual Studio でアップグレードを確認します。デフォルトを使用する Debug
構成を選択し、プロジェクトを右クリックします libpng
構築する。切り替える Release Library
設定してプロジェクトを右クリックします libpng
構築する。
ピクスマン
編集 pixman\Makefile.win32.common
:
- 交換する
CFG_CFLAGS = -MD -O2
とCFG_CFLAGS = -MT -O2
(リリース ビルドの CRT の静的リンク バージョンにリンク) - 交換する
@mkdir
と@"mkdir"
(があるcmd
の組み込みmkdir
そしてGnuWinのmkdir
, 、引用符は後者の使用を強制します)
スタート メニューから Visual Studio x86 ネイティブ コマンド プロンプトを実行します。
cd /d my_cairo_build_root
cd pixman\pixman
make -f Makefile.win32
make -f Makefile.win32 CFG=debug
カイロ
編集 cairo\build\Makefile.win32.common
:
- 交換する
CFG_CFLAGS = -MD -O2
とCFG_CFLAGS = -MT -O2
- 交換する
CAIRO_LIBS += $(LIBPNG_PATH)/libpng.lib
とCAIRO_LIBS += $(LIBPNG_PATH)/lib/$(CFG)/libpng16.lib
. 。次に、ディレクトリをコピーしますlibpng\projects\vstudio\Debug
(作成された)libpng\lib\
に名前を変更しますdebug
. 。ディレクトリをコピーするlibpng\projects\vstudio\Release Library
の中へlibpng\lib\
に名前を変更しますrelease
. - 交換する
CAIRO_LIBS += $(ZLIB_PATH)/zdll.lib
とCAIRO_LIBS += $(LIBPNG_PATH)/lib/$(CFG)/zlib.lib
二つあります
@mkdir -p $(CFG)/`dirname $<`
線。両方を次のように置き換えます。@"mkdir" -p $(CFG)/$< @"rmdir" $(CFG)/$<
編集 cairo\build\Makefile.win32.features-h
:
- すべて置き換える
@echo
と@"echo"
使えないものがある link.exe
GnuWin で。名前の変更 C:\GnuWin\bin\link.exe
に link_.exe
衝突を避けるために。
スタート メニューから Visual Studio x86 ネイティブ コマンド プロンプトを実行します。
cd /d my_cairo_build_root
cd cairo
make -f Makefile.win32 CFG=debug
make -f Makefile.win32 CFG=release
最後の 2 つのコマンドは次のように表示されます "Built successfully!"
しかしエラーを返します。無視してください。
名前を元に戻す C:\GnuWin\bin\link.exe
.
Visual Studio を構成する
ディレクトリを作成する include
次のヘッダーをコピーします。
cairo\cairo-version.h
(ないcairo\src\cairo-version.h
)cairo\src\*.h
, を除くcairo\src\cairo-version.h
そのディレクトリを追加して、Visual Studio にパスを含めます。
追加 cairo\src\$(Configuration)
そして libpng\lib\$(Configuration)
ライブラリパスへ。 $(Configuration)
自動的に次のように展開されます Debug
または Release
建てるとき。
置く cairo\src\debug\cairo.dll
そして libpng\lib\debug\libpng16.dll
Windows のいずれかに PATH
.
前に #include <cairo.h>
, 、リンク オプションを設定します。
#ifndef NDEBUG
# pragma comment(lib, "cairo")
#else
#define CAIRO_WIN32_STATIC_BUILD
# pragma comment(lib, "cairo-static")
# pragma comment(lib, "libpng16")
# pragma comment(lib, "zlib")
#endif
この手順は imlib の現在のバージョンでは機能しないようですが、この質問を再質問する価値があるでしょうか?
ここをチェックしましたか: http://cairographics.org/visualstudio/ ?「Visual C++ 2005/2008 と互換性のない MSCVRT ランタイムを使用しています」とはどういう意味ですか?あなたが抱えている具体的な問題は何ですか?
Windows (Visual Studio 2008、GNU Make 3.81) 上でビルドするときに 2 つの問題に遭遇しました。
src/Makefile.sources 内の "if" 構造が無効です。を使用して修正しました
sed "s/^if \([A-Z_]*\)$/ifeq ($(\1), 1)/" src\Makefile.sources
_lround
Windows/MSVC では利用できません。を使用してそれを回避しましたsed "s/#define _cairo_lround lround/static inline long cairo_const _cairo_lround(double r) { return (long)floor(r + .5); }/"`
(これはおそらく不十分な修正です)
これらの問題は別として、すべてがうまく機能します (x86 アーキテクチャと x86_64 アーキテクチャの両方で)。
これを実行しましたが、既製の手順がありません。たとえば、サポートを必要としていないため、私のビルドもかなり最小限です。PNG および SVG ファイル。生成されたベクター グラフィックスをメモリ バッファーにレンダリングするために使用しました。
しかし、私がやったことは、 config.h
UNIX/GNU ビルド システム用のその他のファイルを作成し、MSVC に適した独自のファイルを作成して、適切なソース ファイルを使用してプロジェクトを作成します。これを行うにはおそらくせいぜい数時間かかりますが、完了すると問題なく動作します ;)
編集:このページを参照してください。このページには、cairo を構築するための MSVC 2003 (7.1) プロジェクトがあります。 http://slinavlee.googlepages.com/
MSYS+gcc ツールチェーンは古い MSVCRT ランタイム ライブラリ (現在は Windows に組み込まれている) を使用し、Visual C++ 2005/2008 は独自のライブラリを使用します。それは 既知の事実 そのコードは複数のランタイムに依存すべきではありません。物を渡すことファイルハンドル、メモリポインタなど。が影響を受け、そのようなシナリオでは明らかにランダムなクラッシュが発生します。
私はこれに噛まれたことはありません。繰り返しになりますが、私はもう Windows をターゲットにしていません。しかし、私はその解決策を試す必要すらないと十分に言われてきました。
すべての依存関係を静的にライブラリにリンクすることでうまくいく可能性があります (たとえば、Cairomm)。静的ライブラリにはランタイムがバインドされていませんね。しかし、私はこれを試しませんでした。実際にすべてのコンポーネントの VC++ ビルドを機能させることができましたが、数日かかりました。
教えていただいたURLが見つかりませんでした。それ自体が奇妙だ。私は「どこでも」見ました。繰り返しになりますが、これは Visual Studio 2003.NET 用なので、すでに 2 世代遅れています。