質問

プリコンパイルされた 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> 変化 truefalse

開ける libpng\projects\vstudio\vstudio.sln Visual Studio でアップグレードを確認します。デフォルトを使用する Debug 構成を選択し、プロジェクトを右クリックします libpng 構築する。切り替える Release Library 設定してプロジェクトを右クリックします libpng 構築する。

ピクスマン

編集 pixman\Makefile.win32.common:

  • 交換する CFG_CFLAGS = -MD -O2CFG_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 -O2CFG_CFLAGS = -MT -O2
  • 交換する CAIRO_LIBS += $(LIBPNG_PATH)/libpng.libCAIRO_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.libCAIRO_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.exelink_.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 つの問題に遭遇しました。

  1. src/Makefile.sources 内の "if" 構造が無効です。を使用して修正しました

    sed "s/^if \([A-Z_]*\)$/ifeq ($(\1), 1)/" src\Makefile.sources
    
  2. _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 世代遅れています。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top