CMake zlib построен на Windows

Я пытаюсь создать zlib 1.2.8 для Windows с помощью CMake, но я получаю ошибки сборки, которые я не знаю, как исправить. Здесь мой 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_fast, на который ссылается функция inflate
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 неразрешенные внешние

Я не знаю, как я могу это исправить, поэтому я ценю любую помощь.

Ответ 1

В соответствии с https://wiki.apache.org/httpd/Win64Compilation очень похожая ошибка означает:

Это означает, что у вас есть опечатка либо в -DASMV -DASMINF, либо в вашем OBJ = "inffasx64.obj gvmat64.obj inffas8664.obj", так как inflate_fast определен в inffas8664.c.


Я смог успешно построить с помощью простого:

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, и я вижу, что для AMD64 установлено значение false, в отличие от того, что показывает ваше окно cmake-gui. Установив его в true, для меня возникают всевозможные ошибки сборки, но не те, которые вы показываете.

CMakeLists.txt говорит, что этот параметр должен включать реализацию сборки AMD64. Просто без него это может быть самым простым решением.

Ответ 2

Вам нужно contrib\masmx64\inffas8664.c, включенное в файл проекта visual studio. Этот файл содержит функцию inflate_fast, которая вызывает соответствующие функции asm.

Ответ 3

Дата: 20180804 (Aug 4 - й 2018)

Играя с ускорением ассемблера, я обнаружил, что проблема воспроизводима в (в настоящее время) последней версии: v1.2.11 ([GitHub]: madler/zlib - очень компактная, но деликатно ненавязчивая библиотека сжатия (http://zlib.net)).

Эта ошибка возникает только (очевидно, ОС: Win, сборка инструментария сборки: VStudio и ускорение сборки включены) для:

  • cmake build (работает нормально для "$ {ZLIB_SRC_DIR}/win32/Makefile.msc")
  • архитектура x64 (AMD64) (работает нормально для x86)

Ниже приведен "стек вызовов" (top → down эквивалентен external → inner) во время распаковки.

  • Нормальный случай:

    1. раздувать (inflate.c)
    2. inflate_fast (inffast.c)
    3. ...
  • Корпус ассемблера:

    1. раздувать (inflate.c)
    2. inflate_fast (contrib/masmx64/inffast8664.c)
    3. inffas8664fnc (contrib/masmx64/inffasx64.asm)
    4. ...

Проблема:

# 2. отсутствует ("$ {ZLIB_SRC_DIR}/CMakeLists.txt" ничего не знает о inffast8664.c), поэтому цепочка разорвана, что приводит к неверной библиотеке.

Решение:

Сделайте CMakeLists.txt осведомленным об этом файле, добавив:

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

в строке ~ # 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

Выше приведен дифференциал. См. [SO]: запускать/отлаживать UnitTests приложения Django из контекстного меню, вызываемого правой кнопкой мыши, в PyCharm Community Edition? (Ответ @CristiFati) (раздел " Патч на utrunner ") о том, как применять патчи на Win (в основном, каждая строка, начинающаяся с одного знака "+", вводится, а каждая строка, начинающаяся с одного знака "-", исчезает). Я использую Cygwin, кстати.
Я также отправил этот патч в [GitHub]: madler/zlib - Ms VisualStudio - ускорения Ассемблера на x64, но я не уверен, какова его судьба, так как ожидается более 100 запросов на получение, ожидающих рассмотрения.

Выход:

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
  • Что касается вышеприведенного вывода:
    • Чтобы вывод был как можно меньше, я строю только статическую версию
      • По той же причине (а также для того, чтобы оставить ее как текст), я создаю "NMake Makefiles" (сборка cmdline)
    • inffas8664.c строится (где-то ближе к концу)
  • Вы также можете отключить ускорение ассемблера (сняв флажок с AMD64 в cmake-gui), но это будет просто обходной путь
  • Я провел несколько грубых тестов (безусловно, я не претендую на то, что эти результаты были общими), и улучшение производительности ассемблерной реализации по сравнению со стандартной (отладочные версии) было (процент ниже - это соотношение между затратами времени на выполнение та же операция (с/без) ускорений):
    • Компресс: ~ 86%
    • Распаковка: ~ 62%

@EDIT0:

Комментарий @MarkAdler ([GitHub]: madler/zlib - сборка ASM zlib на Windows дает ошибочные результаты) гласит:

Какой ассемблерный код используется? В каталоге zlib contrib есть несколько. Кстати, материал в каталоге contrib не является частью zlib. Это просто для удобства и поддерживается (или нет) сторонними участниками. То, что я сделаю, это просто удалите оскорбительный код из следующего выпуска.

Так же, как предупреждение о компиляции (что каждый, должно быть, видел (и, скорее всего, игнорировал)):

Assembler code may have bugs -- use at your own risk

Очевидно, ускорение ассемблера и VStudio не очень хорошо ладят. Более того, на x86 есть несколько проблем:

После исправления все работает нормально, а улучшения производительности похожи на x64.