J'essaie de construire zlib 1.2.8 pour Windows en utilisant CMake, mais j'obtiens des erreurs de construction que je ne sais pas comment corriger. Voici mon interface graphique CMake:
Cela génère sans erreurs, mais lorsque je crée la solution résultante. Je reçois cette erreur:
2> ------ Construction commencée: Projet: zlib, Configuration: Release x64 ------
2> Création de la bibliothèque C: /Users/erik/Documents/zlib/1.2.8/project/zlib-1.2.8-vc10/Release/zlib.lib et de l'objet C:/Users/erik/Documents/zlib/1.2.8/project/zlib-1.2.8-vc10/Release/zlib.exp
2> inflate.obj: erreur LNK2019: symbole externe non résolu inflate_fast référencé dans la fonction inflate
2> infback.obj: erreur LNK2001: symbole externe non résolu inflate_fast
2> C:\Users\erik\Documents\zlib\1.2.8\project\zlib-1.2.8-vc10\Release\zlib.dll: erreur fatale LNK1120: 1 externes non résolus
Je ne sais pas comment résoudre ce problème, j'apprécie donc toute aide.
Selon https://wiki.Apache.org/httpd/Win64Compilation une erreur très similaire signifie:
Cela signifie que vous avez une faute de frappe dans -DASMV -DASMINF ou dans votre OBJ = "inffasx64.obj gvmat64.obj inffas8664.obj" puisque inflate_fast est défini dans inffas8664.c.
J'ai pu construire avec succès avec un simple:
mkdir C:\Builds\zlib; cd C:\Builds\zlib
cmake -G "Visual Studio 12 2013" -A x64 D:\Downloads\zlib-1.2.8\
cmake --build .
J'ai regardé mon cache cmake et je vois que AMD64 est défini sur false, contrairement à ce que montre votre fenêtre cmake-gui. La définir sur true entraîne pour moi toutes sortes d'erreurs de construction, mais pas celles que vous montrez.
CMakeLists.txt indique que cette option consiste à activer une implémentation d'assemblage AMD64. Se passer de cela semble être la solution la plus simple.
Vous avez besoin de contrib\masmx64\inffas8664.c inclus dans le fichier de projet Visual Studio. Ce fichier contient inflate_fast
fonction qui appelle les fonctions asm
correspondantes.
Date: 20180804 ( 4 aoûte 2018 )
En jouant avec les accélérations d'assembleur, j'ai découvert que le problème est reproductible sur la dernière version (actuellement): v1.2.11 ( [GitHub]: madler/zlib - Une bibliothèque de compression massivement spiffy mais délicatement discrète (http://zlib.net) ).
Cette erreur se produit uniquement (évidemment, [~ # ~] os [~ # ~] : Win , build toolchain: VStudio et accélérations d'assemblage activées) pour:
Ci-dessous est un " callstack " ( top -> down est équivalent à external -> inner ) pendant décompression.
Cas normal:
Cas de l'assembleur:
# 2. est manquant ( "$ {ZLIB_SRC_DIR} /CMakeLists.txt" ne sait rien de inffast8664.c ), donc la chaîne est cassée, conduisant à une bibliothèque invalide.
Rendez CMakeLists.txt conscient de ce fichier, et c'est en ajoutant:
set(ZLIB_SRCS
${ZLIB_SRCS}
contrib/masmx64/inffas8664.c
)
à ligne ~ # 158 (entouré par if(MSVC)
et elseif (AMD64)
conditionnelles).
Publication complète des modifications également.
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
Ce qui précède est un diff . Voir [SO]: exécuter/déboguer un Django application UnitTests du menu contextuel du clic droit de la souris dans PyCharm Community Edition? (@ La réponse de CristiFati) ( Patching utrunner section) pour savoir comment appliquer des correctifs sur Win (fondamentalement, chaque ligne qui commence par un signe "+" entre, et chaque ligne commençant par un "-" le signe s'éteint.) J'utilise Cygwin , btw .
J'ai également soumis ce correctif à [GitHub]: madler/zlib - Ms VisualStudio - Accélérations d'assembleur sur x64, mais je ne sais pas quel sera son sort, car il y a plus de 100 demandes de tirage en attente.
Sortie :
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
Remarques :
@ EDIT0 :
( [GitHub]: madler/zlib - La construction ASM zlib sur Windows donne des résultats erronés (commentaire de @ madler) ) déclare:
Quel code d'assemblage est utilisé? Il y en a quelques uns dans le répertoire contrib de zlib. Soit dit en passant, les éléments du répertoire contrib ne font pas partie de zlib. Il n'est là que par commodité et est pris en charge (ou non) par ces tiers contributeurs. Je vais simplement supprimer le code incriminé de la prochaine distribution.
Tout comme l'avertissement de compilation (que tout le monde doit avoir vu (et probablement ignoré)):
Assembler code may have bugs -- use at your own risk
Apparemment, les accélérations d'assembleur et VStudio ne s'entendent pas très bien. De plus, sur x86 il y a plusieurs problèmes:
Un correctif est proposé par [SO]: module dangereux pour l'image SAFESEH C++ (réponse de @ NayanaAdassuriya) (bien qu'il ne soit pas directement lié à la question). En bref, l'option inffas32.asm et de l'éditeur de liens [MS.Docs]:/SAFESEH (l'image a des gestionnaires d'exceptions sûrs) ne correspond pas. Pour s'en débarrasser, soit:
Puisque j'utilise cmake pour construire pour cmdline , j'ai trouvé une solution pour cela. Après génération de CMakeFiles (mais avant la construction), je le précise:
Je suis sûr que cmake offre un moyen de faire ce qui précède de manière appropriée, mais je ne l'ai pas trouvé (ni enquêté de manière approfondie).
Un méchant est un défaut de segmentation ( Violation d'accès ) pendant la décompression. Pour cela, [GitHub]: madler/zlib - liaison struct/enum inffas32.asm à zlib 1.2.9 est nécessaire.
Après avoir corrigé ces problèmes, tout fonctionne correctement et les améliorations de performances sont similaires à x64 .