web-dev-qa-db-fra.com

CMake zlib build sur Windows

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:

enter image description here

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.

16
elveatles

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.

14
bames53

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.

10
Eun Suk Lee

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:

  • build cmake (fonctionne [~ # ~] ok [~ # ~] pour "$ {ZLIB_SRC_DIR}/win32/Makefile .msc ")
  • x64 ( AMD64 ) architecture (fonctionne [~ # ~] ok [~ # ~] pour x86 )

Ci-dessous est un " callstack " ( top -> down est équivalent à external -> inner ) pendant décompression.

  • Cas normal:

    1. gonfler ( gonfler.c )
    2. inflate_fast ( inffast.c )
    3. ...
  • Cas de l'assembleur:

    1. gonfler ( gonfler.c )
    2. inflate_fast ( contrib/masmx64/inffast8664.c )
    3. inffas8664fnc ( contrib/masmx64/inffasx64.asm )
    4. ...

Problème:

# 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.

Solution:

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 :

  • J'utilise VStudio 2015
  • Concernant la sortie ci-dessus:
    • Pour garder la sortie aussi petite que possible, je construis uniquement la version statique
      • Pour la même raison (et aussi pour le garder comme texte), je construis pour "NMake Makefiles" ( build cmdline )
    • inffas8664.c est en cours de construction (quelque part vers la fin)
  • Vous pouvez également désactiver les accélérations de l'assembleur (en décochant AMD64 dans cmake-gui ), mais ce ne serait qu'une solution de contournement
  • J'ai fait quelques tests approximatifs (de loin, je ne prétends pas que ces résultats soient généraux), et l'amélioration des performances de l'implémentation de l'assembleur par rapport à la version standard ( Debug versions) était (a pour cent ci-dessous est le rapport entre les temps nécessaires pour effectuer la même opération (avec/sans) accélérations):
    • Compresser: ~ 86%
    • Décompresser: ~ 62%

@ 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:

Après avoir corrigé ces problèmes, tout fonctionne correctement et les améliorations de performances sont similaires à x64 .

7
CristiFati