문제

대부분의 사전 컴파일된 Windows 바이너리는 MSYS+gcc 툴체인을 사용하여 만들어집니다.Visual C++ 2005/2008과 호환되지 않는 MSVCRT 런타임을 사용합니다.

따라서 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 ++ Command Line Compiler (CL) 용 MakeFiles가 있지만 GNU MakeFile 및 Unix-Like 도구 (SED 등)를 사용합니다.이것은 우리가 MSYS 내에서 제작을 실행해야한다는 것을 의미합니다.

VC++ 명령줄 도구를 활성화하여 명령 프롬프트를 엽니다('cl /?' 시도).해당 명령 프롬프트를 'C:\MSYS\1.0\MSYS.BAT'에 의해 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

이 기본값은 MMX 및 SSE2 최적화로, 새로운 X86 프로세서 (Pentium 4 또는 Pentium M 이상 : 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

(백슬래시를 무시하고 모든 내용을 한 줄에 작성합니다)

"'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'과 'build'를 마우스 오른쪽 버튼으로 클릭합니다.몇 가지 경고가 있습니다.

    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

zlib

빌드하지 마십시오.빌드 스크립트는 Visual Studio 2015와 충돌하는 MSVCRT를 사용합니다.libpng 빌드에서 생성된 lib를 사용합니다.

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 그누윈에서.이름 바꾸기 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

마지막 두 명령이 표시됩니다 "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)에서 빌드할 때 두 가지 문제에 직면했습니다.

  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에 적합한 자체 작성을 한 다음 적절한 소스 파일을 사용하여 프로젝트를 만듭니다.이 작업을 수행하는 데는 기껏해야 몇 시간이 걸릴 수 있지만 작업이 끝나면 제대로 작동합니다. ;)

편집하다:이 페이지를 참조하세요. 카이로 구축을 위한 MSVC 2003(7.1) 프로젝트가 있습니다. http://slinavlee.googlepages.com/

MSYS+gcc 툴체인은 기존 MSVCRT 런타임 라이브러리(현재 Windows에 내장되어 있음)를 사용하며 Visual C++ 2005/2008에서는 자체 라이브러리를 가져옵니다.이것은 알려진 사실 해당 코드는 여러 런타임에 의존해서는 안 됩니다.물건 전달 s.a.파일 핸들, 메모리 포인터 등영향을 받으며 이러한 시나리오에서는 분명히 무작위 충돌이 발생합니다.

나는 이것에 물린 적이 없습니다.그리고 다시 말하지만, 저는 더 이상 Windows를 대상으로 하지 않습니다.그러나 나는 해결책을 시도조차 하지 않을 만큼 충분히 들었다.

효과가 있었던 것은 모든 종속성을 lib(예: Cairomm)에 정적으로 연결하는 것입니다.정적 라이브러리에는 바인딩된 런타임이 없습니다. 그렇죠?그러나 나는 이것을 시도하지 않았습니다.실제로 모든 재료의 VC++ 건물이 작동하도록 만들었지만 며칠이 걸렸습니다.

당신이 제공한 URL을 찾지 못했습니다.그 자체로 이상합니다.나는 '모든 곳'을 보았다.그리고 다시 말씀드리지만 Visual Studio 2003.NET용이므로 이미 2세대 뒤쳐져 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top