Сборка CMake zlib в Windows
Я пытаюсь построить zlib 1.2.8 для Windows с помощью CMake, но я получаю ошибки сборки, которые я не знаю, как исправить. Вот мой графический интерфейс CMake:
это генерирует без ошибок, но когда я создаю результирующее решение. Я получаю эту ошибку:
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" (сверху -> вниз эквивалентно к внешний -> внутренний) во время декомпрессии.
-
обычный случай:
-
inflate
(раздувать.c) -
inflate_fast
(inffast.c) - ...
-
-
ассемблер делу:
-
inflate
(раздувать.c) -
inflate_fast
(contrib/masmx64 / inffast8664.c) -
inffas8664fnc
(contrib/masmx64 / inffasx64.asm) - ...
-
проблема:
#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 есть несколько вопросов:
-
один исправить предлагается [SO]: модуль небезопасен для SAFESEH image C++ (ответ@NayanaAdassuriya) (хотя это напрямую не связано с вопросом). Короче говоря,inffas32.asm и линкерС [MSDN]: / SAFESEH (изображение имеет Безопасные обработчики исключений) не совпадают. Чтобы избавиться от него, либо:
- отключить опцию (включена по умолчанию на x86 Release)
- передать для ассемблер ( ml.exe)
- объявить один в asm
С cmake построить для cmdline, я нашел обходной путь для этого. После CMakeFiles поколения (но до the build), указываю его:
- на флаги.make (
ASM_MASM_FLAGS
) - так как я строю статический lib (и для Debug строит мне нужны символы), мне нужно изменить [MSDN]: /Z7, /Zi, / ZI (формат отладочной информации), поэтому я изменяю тот же файл (
C_FLAGS
)
я уверен, что cmake предлагает способ сделать это должным образом, но я не нашел его (и не исследовал тщательно).
противный - это обработка выхода онлайн / оффлайн (Нарушение Прав Доступа) во время декомпрессии. За это,[GitHub]: madler/zlib - inffas32.ASM struct/enum привязка к zlib 1.2.9 это.
после их исправления все работает нормально, и улучшения производительности похожи на х64.