CMakeを使用してWindows用のzlib 1.2.8をビルドしようとしていますが、修正方法がわからないビルドエラーが発生します。これが私のCMake GUIです。
これはエラーなしで生成されますが、結果として得られるソリューションをビルドするときです。私はこのエラーを受け取ります:
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つの未解決の外部
どうすれば修正できるかわかりませんので、よろしくお願いします。
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アセンブリの実装を有効にすることです。これなしで行うのが最も簡単な解決策のようです。
contrib\masmx64\inffas8664.cがVisual Studioプロジェクトファイルに含まれている必要があります。このファイルにはinflate_fast
関数は、対応するasm
関数を呼び出します。
日付:20180804(8月4日番目 2018)
アセンブラの高速化を試してみたところ、この問題が(現在の)最新バージョンで再現可能であることを発見しました:v1.2.11( [GitHub]:madler/zlib-非常に洗練されていて、繊細で控えめな圧縮ライブラリ(http://zlib.net) )。
このエラーは発生しますのみ(明らかに、[〜#〜] os [〜#〜]:Win、ビルドツールチェーン:VStudioおよび有効化されたアセンブリのスピードアップ):
以下は、解凍中の "callstack"(top-> downはouter-> innerと同等)です。
通常の場合:
アセンブラケース:
#2。がありません("$ {ZLIB_SRC_DIR} /CMakeLists.txt"はinffast8664.cについて何も知りません)、チェーンが切断され、無効なライブラリにつながります。
CMakeLists.txtにそのファイルを認識させます。これは次のように追加します。
_set(ZLIB_SRCS
${ZLIB_SRCS}
contrib/masmx64/inffas8664.c
)
_
at line 〜#158(if(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 "-"記号で始まるすべての行が消えます。私はCygwin、btwを使用しています。
私はこのパッチも[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
_
メモ:
@ 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にはいくつかの問題があります。
[SO]:SAFESEH image C++に対して安全でないモジュール(@NayanaAdassuriyaの回答) によって1つの修正が提案されています(ただし、これは質問とは直接関係ありません)。要するに、inffas32.asmおよびリンカーのオプション [MS.Docs]:/ SAFESEH(画像に安全な例外ハンドラーがある) は一致しません。それを取り除くには、次のいずれかを行います:
私はcmakeを使用してcmdlineをビルドするので、これの回避策を見つけました。 CMakeFilesの生成後(ただしbeforeビルド)、指定します。
cmakeが上記を適切に行う方法を提供していると確信していますが、それが見つかりませんでした(または徹底的に調査しませんでした)。
厄介なのは、解凍中のsegfault(アクセス違反)です。そのためには、 [GitHub]:madler/zlib-inffas32.asm struct/enum binding to zlib 1.2.9 が必要です。
これらを修正した後、すべてが正常に機能し、パフォーマンスの向上はx64に似ています。