Сборка CMake zlib в Windows

Я пытаюсь построить zlib 1.2.8 для Windows с помощью CMake, но я получаю ошибки сборки, которые я не знаю, как исправить. Вот мой графический интерфейс CMake:

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> надувать.obj : ошибка LNK2019: неразрешенный внешний символ inflate_fast, на который ссылается функция inflate
2 > infback.obj: ошибка LNK2001: неразрешенный внешний символ inflate_fast
2>C:UserserikDocumentszlib1.2.8projectzlib-1.2.8-vc10Releasezlib - ... dll : фатальная ошибка LNK1120: 1 неразрешенные внешние

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

3 ответов


согласно 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. Просто обойтись без этого кажется самым простым решением.


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


дата: 20180704. ( 2018 авг 4)

играя с ускорениями ассемблера, я обнаружил, что проблема воспроизводима на (в настоящее время) последней версии: В1.2.11 ([GitHub]: массивно изысканная, но деликатно ненавязчивая библиотека сжатия (http://zlib.net)).

эта ошибка происходит только (очевидно, OS: Win, сборка toolchain:VStudio и ускорение сборки включено) для:

  • cmake build (работает OK на " ${ZLIB_SRC_DIR} / win32 / Makefile.msc")
  • х64 (для amd64 Архитектура) (строительство OK на x86)

ниже-это "callstack" (сверху -> вниз эквивалентно к внешний -> внутренний) во время декомпрессии.

  • обычный случай:

    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
)

at строка ~#158 (тег if(MSVC) и elseif (AMD64) conditionals).


Публикация полных изменений.

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]: запуск / отладка UnitTests приложения Django из контекстного меню правой кнопкой мыши в PyCharm Community Edition? (@CristiFati по ответ) (исправление utrunner Раздел) для того, как применять патчи на Win (в основном, каждая строка, которая начинается с один "+" знак идет, и каждая строка, которая начинается с один "-" знак тухнет). Я использую Cygwin, кстати.
я также отправил этот патч в [GitHub]: madler/zlib - Ms VisualStudio - ускорение ассемблера на x64, но я не уверен, что его судьба будет, так как есть более чем 100 запросы pull, которые находятся в ожидании.

выход:

e:\Work\Dev\StackOverflow\q029505121\build\x64>"c:\Install\Google\Android_SDK\cmake.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.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 build)
    • inffas8664.c строится (где-то в конце)
  • вы также можете отключить ускорение ассемблера (по сняв для amd64 на cmake-gui), но это было бы просто обходным путем
  • я сделал несколько грубых тестов (на сегодняшний день я не утверждаю, что эти результаты являются общими) и улучшение производительности реализации ассемблера по сравнению со стандартным (Debug версии) был (процент ниже -соотношение между временами, необходимыми для выполнения той же операции (С / без) ускорений):
    • сжатие: ~86%
    • распаковать: ~62%

@EDIT0:

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

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

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

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

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

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