web-dev-qa-db-ja.com

WindowsでのCMake zlibビルド

CMakeを使用してWindows用のzlib 1.2.8をビルドしようとしていますが、修正方法がわからないビルドエラーが発生します。これが私のCMake GUIです。

enter image description here

これはエラーなしで生成されますが、結果として得られるソリューションをビルドするときです。私はこのエラーを受け取ります:

2> ------ビルド開始:プロジェクト:zlib、構成:リリースx64 ------
2>ライブラリC:/Users/erik/Documents/zlib/1.2.8/project/zlib-1.2.8-vc10/Release/zlib.libおよびオブジェクトC:/ Users/erik/Documents /の作成zlib/1.2.8/project/zlib-1.2.8-vc10/Release/zlib.exp
2> inflate.obj:エラーLNK2019:関数inflateで参照されている未解決の外部シンボルinflate_fast
2> infback.obj:エラーLNK2001:未解決の外部シンボルinflate_fast
2> C:\ Users\erik\Documents\zlib\1.2.8\project\zlib-1.2.8-vc10\Release\zlib.dll:致命的なエラーLNK1120:1つの未解決の外部

どうすれば修正できるかわかりませんので、よろしくお願いします。

16
elveatles

https://wiki.Apache.org/httpd/Win64Compilation によると、非常に類似したエラーは以下を意味します:

これは、inflate_fastがinffas8664.cで定義されているため、-DASMV -DASMINFまたはOBJ = "inffasx64.obj gvmat64.obj inffas8664.obj"にタイプミスがあることを意味します。


簡単にビルドできました:

mkdir C:\Builds\zlib; cd C:\Builds\zlib
cmake -G "Visual Studio 12 2013" -A x64 D:\Downloads\zlib-1.2.8\
cmake --build .

Cmake-guiウィンドウに表示されているものとは異なり、cmakeキャッシュを調べたところ、AMD64がfalseに設定されています。これをtrueに設定すると、表示されるエラーではなく、あらゆる種類のビルドエラーが発生します。

CMakeLists.txtによると、このオプションはAMD64アセンブリの実装を有効にすることです。これなしで行うのが最も簡単な解決策のようです。

14
bames53

contrib\masmx64\inffas8664.cがVisual Studioプロジェクトファイルに含まれている必要があります。このファイルにはinflate_fast関数は、対応するasm関数を呼び出します。

10
Eun Suk Lee

日付:201808048月4日番目 2018

アセンブラの高速化を試してみたところ、この問題が(現在の)最新バージョンで再現可能であることを発見しました:v1.2.11[GitHub]:madler/zlib-非常に洗練されていて、繊細で控えめな圧縮ライブラリ(http://zlib.net) )。

このエラーは発生しますのみ(明らかに、[〜#〜] os [〜#〜]Win、ビルドツールチェーン:VStudioおよび有効化されたアセンブリのスピードアップ):

  • cmakeビルド(機能[〜#〜] ok [〜#〜] for "$ {ZLIB_SRC_DIR} /win32/Makefile.msc"
  • x64AMD64)アーキテクチャ([〜#〜] ok [〜#〜] for x86

以下は、解凍中の "callstack"(top-> downouter-> innerと同等)です。

  • 通常の場合:

    1. inflateinflate.c
    2. inflate_fastinffast.c
    3. ...
  • アセンブラケース:

    1. inflateinflate.c
    2. inflate_fastcontrib/masmx64/inffast8664.c
    3. inffas8664fnccontrib/masmx64/inffasx64.asm
    4. ...

問題:

#2。がありません("$ {ZLIB_SRC_DIR} /CMakeLists.txt"inffast8664.cについて何も知りません)、チェーンが切断され、無効なライブラリにつながります。

解決:

CMakeLists.txtにそのファイルを認識させます。これは次のように追加します。

_set(ZLIB_SRCS
    ${ZLIB_SRCS}
    contrib/masmx64/inffas8664.c
)
_

at line 〜#158if(MSVC)およびelseif (AMD64)条件式で囲まれています)。


完全な変更も投稿します。

zlib-1.2.11-msvc_x64_asm_speedups.diff

_--- CMakeLists.txt.orig 2017-01-15 08:29:40.000000000 +0200
+++ CMakeLists.txt  2018-09-03 13:41:00.314805100 +0300
@@ -79,10 +79,10 @@
 endif()

 set(ZLIB_PC ${CMAKE_CURRENT_BINARY_DIR}/zlib.pc)
-configure_file( ${CMAKE_CURRENT_SOURCE_DIR}/zlib.pc.cmakein
-       ${ZLIB_PC} @ONLY)
-configure_file(    ${CMAKE_CURRENT_SOURCE_DIR}/zconf.h.cmakein
-       ${CMAKE_CURRENT_BINARY_DIR}/zconf.h @ONLY)
+configure_file(${CMAKE_CURRENT_SOURCE_DIR}/zlib.pc.cmakein
+        ${ZLIB_PC} @ONLY)
+configure_file(${CMAKE_CURRENT_SOURCE_DIR}/zconf.h.cmakein
+        ${CMAKE_CURRENT_BINARY_DIR}/zconf.h @ONLY)
 include_directories(${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_SOURCE_DIR})


@@ -136,30 +136,34 @@
         set(ZLIB_ASMS contrib/AMD64/AMD64-match.S)
     endif ()

-   if(ZLIB_ASMS)
-       add_definitions(-DASMV)
-       set_source_files_properties(${ZLIB_ASMS} PROPERTIES LANGUAGE C COMPILE_FLAGS -DNO_UNDERLINE)
-   endif()
+    if(ZLIB_ASMS)
+        add_definitions(-DASMV)
+        set_source_files_properties(${ZLIB_ASMS} PROPERTIES LANGUAGE C COMPILE_FLAGS -DNO_UNDERLINE)
+    endif()
 endif()

 if(MSVC)
     if(ASM686)
-       ENABLE_LANGUAGE(ASM_MASM)
+        ENABLE_LANGUAGE(ASM_MASM)
         set(ZLIB_ASMS
-           contrib/masmx86/inffas32.asm
-           contrib/masmx86/match686.asm
-       )
+            contrib/masmx86/inffas32.asm
+            contrib/masmx86/match686.asm
+        )
     elseif (AMD64)
-       ENABLE_LANGUAGE(ASM_MASM)
+        ENABLE_LANGUAGE(ASM_MASM)
         set(ZLIB_ASMS
-           contrib/masmx64/gvmat64.asm
-           contrib/masmx64/inffasx64.asm
-       )
+            contrib/masmx64/gvmat64.asm
+            contrib/masmx64/inffasx64.asm
+        )
+        set(ZLIB_SRCS
+            ${ZLIB_SRCS}
+            contrib/masmx64/inffas8664.c
+        )
     endif()

-   if(ZLIB_ASMS)
-       add_definitions(-DASMV -DASMINF)
-   endif()
+    if(ZLIB_ASMS)
+        add_definitions(-DASMV -DASMINF)
+    endif()
 endif()

 # parse the full version number from zlib.h and include in ZLIB_FULL_VERSION
_

上記はdiffです。 [SO]:Run/Debug a DjangoアプリケーションのUnitTestsをPyCharm Community Editionのマウスの右クリックコンテキストメニューから確認しますか?(@CristiFatiの回答)trunnerセクションへのパッチ適用Winにパッチを適用する方法(基本的に、one "+"で始まるすべての行がサインインし、 one "-"記号で始まるすべての行が消えます。私はCygwinbtwを使用しています。
私はこのパッチも[GitHub]:madler/zlib-Ms VisualStudio-Assembler speedups on x64に提出しましたが、その運命はわかりません保留中の1を超えるプルリクエストがあるためです。

出力

_e:\Work\Dev\StackOverflow\q029505121\build\x64>"c:\Install\Google\Android_SDK\cmake\3.6.4111459\bin\cmake.exe" -G "NMake Makefiles" -DAMD64=ON "e:\Work\Dev\StackOverflow\q029505121\src\zlib-1.2.11"
-- The C compiler identification is MSVC 19.0.24215.1
-- Check for working C compiler: C:/Install/x86/Microsoft/Visual Studio Community/2015/VC/bin/AMD64/cl.exe
-- Check for working C compiler: C:/Install/x86/Microsoft/Visual Studio Community/2015/VC/bin/AMD64/cl.exe -- works
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Looking for sys/types.h
-- Looking for sys/types.h - found
-- Looking for stdint.h
-- Looking for stdint.h - found
-- Looking for stddef.h
-- Looking for stddef.h - found
-- Check size of off64_t
-- Check size of off64_t - failed
-- Looking for fseeko
-- Looking for fseeko - not found
-- Looking for unistd.h
-- Looking for unistd.h - not found
-- Renaming
--     E:/Work/Dev/StackOverflow/q029505121/src/zlib-1.2.11/zconf.h
-- to 'zconf.h.included' because this file is included with zlib
-- but CMake generates it automatically in the build directory.
-- The ASM_MASM compiler identification is MSVC
-- Found assembler: C:/Install/x86/Microsoft/Visual Studio Community/2015/VC/bin/AMD64/ml64.exe
-- Configuring done
-- Generating done
-- Build files have been written to: E:/Work/Dev/StackOverflow/q029505121/build/x64

e:\Work\Dev\StackOverflow\q029505121\build\x64>"c:\Install\Google\Android_SDK\cmake\3.6.4111459\bin\cmake.exe" --build . --target zlibstatic
Scanning dependencies of target zlibstatic
[  5%] Building C object CMakeFiles/zlibstatic.dir/adler32.obj
adler32.c
[ 10%] Building C object CMakeFiles/zlibstatic.dir/compress.obj
compress.c
[ 15%] Building C object CMakeFiles/zlibstatic.dir/crc32.obj
crc32.c
[ 21%] Building C object CMakeFiles/zlibstatic.dir/deflate.obj
deflate.c
Assembler code may have bugs -- use at your own risk
[ 26%] Building C object CMakeFiles/zlibstatic.dir/gzclose.obj
gzclose.c
[ 31%] Building C object CMakeFiles/zlibstatic.dir/gzlib.obj
gzlib.c
[ 36%] Building C object CMakeFiles/zlibstatic.dir/gzread.obj
gzread.c
[ 42%] Building C object CMakeFiles/zlibstatic.dir/gzwrite.obj
gzwrite.c
[ 47%] Building C object CMakeFiles/zlibstatic.dir/inflate.obj
inflate.c
[ 52%] Building C object CMakeFiles/zlibstatic.dir/infback.obj
infback.c
[ 57%] Building C object CMakeFiles/zlibstatic.dir/inftrees.obj
inftrees.c
[ 63%] Building C object CMakeFiles/zlibstatic.dir/inffast.obj
inffast.c
Assembler code may have bugs -- use at your own risk
[ 68%] Building C object CMakeFiles/zlibstatic.dir/trees.obj
trees.c
[ 73%] Building C object CMakeFiles/zlibstatic.dir/uncompr.obj
uncompr.c
[ 78%] Building C object CMakeFiles/zlibstatic.dir/zutil.obj
zutil.c
[ 84%] Building C object CMakeFiles/zlibstatic.dir/contrib/masmx64/inffas8664.obj
inffas8664.c
[ 89%] Building ASM_MASM object CMakeFiles/zlibstatic.dir/contrib/masmx64/gvmat64.obj
Microsoft (R) Macro Assembler (x64) Version 14.00.24210.0
Copyright (C) Microsoft Corporation.  All rights reserved.

 Assembling: E:\Work\Dev\StackOverflow\q029505121\src\zlib-1.2.11\contrib\masmx64\gvmat64.asm
[ 94%] Building ASM_MASM object CMakeFiles/zlibstatic.dir/contrib/masmx64/inffasx64.obj
Microsoft (R) Macro Assembler (x64) Version 14.00.24210.0
Copyright (C) Microsoft Corporation.  All rights reserved.

 Assembling: E:\Work\Dev\StackOverflow\q029505121\src\zlib-1.2.11\contrib\masmx64\inffasx64.asm
[100%] Linking C static library zlibstatic.lib
[100%] Built target zlibstatic
_

メモ

  • VStudio 2015を使用しています
  • 上記の出力について:
    • 出力をできるだけ小さく保つために、私はstaticバージョンのみをビルドしています。
      • 同じ理由で(そしてそれを単なるテキストとして保持するために)、私は"NMake Makefiles"cmdline build)のためにビルドしています。
    • inffas8664.cが構築されています(終わり近くのどこか)
  • アセンブラのスピードアップを無効にすることもできます(ncheckingAMD64 in cmake-gui)ですが、これは単なる回避策です
  • 私はいくつかの大まかなテストを行いました(これまでのところ、これらの結果が一般的であると主張しているわけではありません)。アセンブラー実装のパフォーマンスは、標準的なもの(Debugバージョン)よりも優れています(以下のパーセントは同じ操作を実行するのにかかる時間の比率(高速化あり/なし)):
    • 圧縮:〜86%
    • 解凍:〜62%

@ EDIT

[GitHub]:madler/zlib-WindowsでのASM zlibビルドが誤った結果を与える(@madlerのコメント) )状態:

使用されているアセンブリコードは何ですか? zlibのcontribディレクトリにはいくつかあります。ちなみに、contribディレクトリの内容はnot zlibの一部です。これは、利便性のためにあり、サードパーティの寄稿者によってサポートされている(またはサポートされていない)ものです。私がすることは、問題のコードを次のディストリビューションから単に削除することです。

コンパイル警告もそうです(誰もが見たはずです(そしておそらく無視されているはずです)):

_Assembler code may have bugs -- use at your own risk
_

どうやら、アセンブラの高速化とVStudioはうまくうまくいきません。さらに、x86にはいくつかの問題があります。

これらを修正した後、すべてが正常に機能し、パフォーマンスの向上はx64に似ています。

7
CristiFati