Проблемы сборки libCurl x64 Visual Studio 2013 (x64) Visual Studio & CMake

Я пытаюсь собрать libCurl x64 на Windows 8.1 x64, и у меня возникают ошибки компоновщика. Я должен быть в состоянии сделать это, так как мне нужно создать 64-битную отладочную версию библиотеки, чтобы я мог отслеживать некоторые странные проблемы, связанные с протоколом FTP, с которыми я сталкиваюсь.

Вывод основной ошибки (для краткости обрезан) выглядит следующим образом

1>------ Начата сборка: Проект: ZERO_CHECK, Конфигурация: Отладка x64

...

2> C: \ Users \ jcoffey \ main \ extlibs \ curl-7.35.0 \ lib \ smtp.c (2174): предупреждение C4267: '+=': преобразование из 'size_t' в 'long', возможная потеря данных 2> pingpong.c 2> rtsp.c 2> curl_threads.c 2> warnless.c 2> hmac.c 2> curl_rtmp.c 2> openldap.c 2> curl_gethostname.c 2> gopher.c 2> Генерация кода... 2> Компиляция... 2> idn_win32.c 2> http_negotiate_sspi.c 2> http_proxy.c 2> non-ascii.c 2> asyn-ares.c 2> asyn-thread.c 2> curl_gssapi.c 2> curl_ntlm.c 2> curl_ntlm_wb.c 2> curl_ntlm_core.c 2> curl_ntlm_msgs.c 2> curl_sasl.c 2> curl_multibyte.c 2> hostcheck.c 2> bundles.c 2> conncache.c 2> pipeline.c 2> dotdot.c 2> x509asn1.c 2> http2.c 2> Генерация кода... 2> Компиляция... 2> openssl.c 2> gtls.c 2> vtls.c 2> nss.c 2> qssl.c 2> polarssl.c 2> polarssl_threadlock.c 2> axtls.c 2> cyassl.c 2> curl_schannel.c 2> curl_darwinssl.c 2> gskit.c 2> Генерация кода...

...

2> x64 \ Debug \ file.obj: фатальная ошибка LNK1112: тип компьютера модуля 'x64' конфликтует с типом целевой машины 'X86' 3>------ Начало сборки: проект: curl, конфигурация: отладка x64 ------ 3> Создание пользовательского правила C:/Users/jcoffey/main/extlibs/curl-7.35.0/src/CMakeLists.txt

Пожалуйста, помогите - я искал на форумах и в stackru что-то похожее, но безрезультатно. Мне удалось успешно выполнить сборку в режиме x86 (win32), но у меня возникают ошибки компоновки, когда я нацеливаюсь на x64.

Шаг 1: Загрузите последнюю версию CMake 2.8.12.2 и обновите среду Windows PATH (в моем случае я использую приглашение оболочки bash MINMGW32, но у меня возникают точно такие же проблемы со связью, если я использую встроенную оболочку Visual Studio 2013 x64 для запуска cmake из)

$ export PATH = $ PATH: / c / Program \ Files \ (x86) / CMake \ 2.8 / bin

убедитесь, что путь и версия Cmake на Windows

$ cmake - версия cmake версии 2.8.12.2

Шаг 2: распакуйте curl-7.35.0 в папку c:\temp\curl-7.35.0"и создайте параллельную папку"c:\temp\curl-7.35.0\build".

Шаг 3: Перейдите в папку сборки и запустите Cmake с таргетингом на "Visual Studio 12" в качестве желаемой комбинации Visual Studio Solution/ Project для создания.

$ cmake -G "Visual Studio 12" ../curl-7.35.0

Это дает массу результатов следующим образом, но также создает работоспособное решение Visual Studio, предназначенное для машин типа X86.

$ cmake -G "Visual Studio 12" ../curl-7.35.0 - Идентификатор компилятора C - MSVC 18.0.21005.1 - Проверка на работающий компилятор C с использованием: Visual Studio 12 - Проверка на работающий компилятор C с использованием: Visual Studio 12 - работает - Обнаружение информации ABI для компилятора C - Обнаружение информации ABI для компилятора C - Готово CMake Предупреждение на CMakeLists.txt:47 (сообщение): система сборки curl cmake плохо поддерживается. Знать

- curl version=[7.35.0] - Ищем getch в ws2_32; - ищу getch в ws2_32; - найдено - поиск getch в winmm;ws2_32 - поиск getch в winmm;ws2_32 - найдено - поиск cldap_open в wldap32 - поиск cldap_open в wldap32 - найдено - поиск idna_to_ascii_lz в idn;winmm;ws2_32 -- Поиск idna_to_ascii_lz в idn; winmm;ws2_32 - не найден - Поиск ldap_init в ldap;winmm;ws2_32 - Поиск ldap_init в ldap;winmm;ws2_32 - не найден - Не удалось найти OpenSSL, попытаться установить путь в корневую папку OpenSSL в системной переменной OPENSSL_ROOT_DIR (отсутствует: OPENSSL_LIBRARIES OPENSSL_INCLUDE_DIR)

- Поиск включаемых файлов ws2tcpip.h - Поиск включаемых файлов ws2tcpip.h - найдено - Поиск включаемых файлов ws2tcpip.h, winsock2.h - Поиск включаемых файлов ws2tcpip.h, winsock2.h - найдено - Ищем 3 включаемых файла ws2tcpip.h,..., stdio.h - Ищем 3 включаемых файла ws2tcpip.h,..., stdio.h - найдено - Ищем 4 включаемых файла ws2tcpip.h,..., windows.h - Ищем 4 включаемых файла ws2tcpip.h,..., windows.h - найдено - Ищем 5 включаемых файлов ws2tcpip.h,..., winsock.h - Ищем 5 включаемых файлов ws2tcpip.h,..., winsock.h - найдено - Ищу 6 включаемых файлов ws2tcpip.h, ..., sys/filio.h - Ищу 6 включаемых файлов ws2tcpip.h, ..., sys/filio.h - не найден - Поиск 6 включаемых файлов ws2tcpip.h, ..., sys/ioctl.h - Поиск 6 включаемых файлов ws2tcpip.h, ..., sys/ioctl.h - не найден - Ищем 6 включаемых файлов ws2tcpip.h, ..., sys/resource.h - Ищем 6 включаемых файлов ws2tcpip.h, ..., sys/resource.h - не найдено - Ищем 8 включаемых файлов ws2tcpip.h, ..., sys/uio.h - Ищем 8 включаемых файлов ws2tcpip.h,..., sys / uio.h - не найден - Ищем 8 включаемых файлов ws2tcpip.h, ..., sys/un.h - Ищем 8 включаемых файлов ws2tcpip.h, ..., sys/un.h - не найдено - Ищем 9 включаемых файлов ws2tcpip.h, ..., arpa/tftp.h -- Ищем 9 включаемых файлов ws2tcpip.h,..., arpa / tftp.h - не найдено - Ищем 9 включаемых файлов ws2tcpip.h,..., assert.h - Ищем 9 включаемых файлов ws2tcpip.h,..., assert.h - найдено - Ищем 10 включаемых файлов ws2tcpip.h, ..., crypto.h - Ищем 10 включаемых файлов ws2tcpip.h, ..., crypto.h - не найдено - - Поиск 10 включаемых файлов ws2tcpip.h,..., des.h - Поиск 10 включаемых файлов ws2tcpip.h,..., des.h - не найден - Поиск 10 включаемых файлов ws2tcpip.h,..., err.h - Ищем 10 включаемых файлов ws2tcpip.h,..., err.h - не найден - Ищем 10 включаемых файлов ws2tcpip.h,..., errno.h - Ищем 10 включаемые файлы ws2tcpip.h,..., errno.h - найдено - Ищем 12 включаемых файлов s ws2tcpip.h, ..., gssapi/gssapi.h - Ищем 12 включаемых файлов ws2tcpip.h,..., gssapi / gssapi.h - не найдены - Ищем 12 включаемых файлов ws2tcpip.h, ..., gssapi/gssapi_generic.h - Ищем 12 включаемых файлов ws2tcpip.h, ..., gssapi/gssapi_generic.h - не найдено - Ищем 12 включаемых файлов ws2tcpip.h, ..., gssapi/gssapi_krb5.h - Ищем 12 включаемых файлов ws2tcpip.h,..., gssapi / gssapi_krb5.h - не основано d - Ищем 12 включаемых файлов ws2tcpip.h,..., idn-free.h - Ищем 12 включаемые файлы ws2tcpip.h,..., idn-free.h - не найдены - Ищем 12 включаемых файлов ws2tcpip.h,..., ifaddrs.h - Ищем 12 включаемых файлов ws2tcpip.h,..., ifaddrs.h - не найдено - Ищем 13 включаемых файлов ws2tcpip.h, ..., krb.h - Ищем 13 включаемых файлов ws2tcpip.h, ..., krb.h - не найдено - Ищем 13 включаемых файлов ws2tcpip.h, ..., libgen.h - Ищем 13 включаемых файлов ws2tcpip.h, ..., libgen.h - не найдено - Ищем 13 включаемых файлов ws2tcpip.h, ..., libssh2.h - Ло ищет 13 включаемых файлов ws2tcpip.h, ..., libssh2.h - не найдено - Ищем 13 включаемых файлов ws2tcpip.h,..., limit.h - Ищем 13 включаемых файлов ws2tcpip.h,..., limit.h - найдено - Ищем 14 включаемых файлов ws2tcpip.h,..., locale.h - Ищем 14 включаемых файлов ws2tcpip.h,..., locale.h - найдено - Ищем 15 включаемые файлы ws2tcpip.h, ..., netinet/tcp.h - Ищем 15 включаемых файлов ws2tcpip.h, ..., netinet/tcp.h - не найдены - Ищем 15 включаемых файлов ws2tcpip.h,..., pem.h - Ищем 15 включаемых файлов ws2tcpip.h,..., pem.h - не найден - Ищем 15 включаемых файлов ws2tcpip.h,..., poll.h - Ищем 15 включаемые файлы ws2tcpip.h,..., poll.h - не найдены - Ищем 15 включаемых файлов ws2tcpip.h,..., rsa.h - Ищем 15 включаемых файлов ws2tcpip.h,..., rsa.h - не найден - Ищем 17 включаемых файлов ws2tcpip.h,..., ssl.h - Ищем 17 включаемых файлов ws2tcpip.h,..., ssl.h - не найден - Ищем 17 включаемых файлов файлы ws2tcpip.h, ..., stdbool.h - Поиск 17 включаемых файлов ws2tcpip.h, ..., stdbool.h - найдено - Поиск 21 включаемых файлов ws2tcpip.h,..., stropts.h - Поиск 21 включаемых файлов ws2tcpip.h,..., stropts.h - не найдено - Ищем 22 включаемых файла ws2tcpip.h,..., tld.h - Ищем 22 включаемых файла ws2tcpip.h,..., tld.h - не найдено - Ищем 23 включаемых файла ws2tcpip.h,..., stddef.h - Ищем 23 включаемых файла ws2tcpip.h,..., stddef.h - найдено - Ищем 26 включаемых файлов ws2tcpip.h,..., ldap.h - ищу 26 включаемых файлов ws2tcpip.h,..., ldap.h - не найден - ищу 26 включаемых файлов ws2tcpip.h, ..., sys/utsname.h - ищу 26 включаемые файлы ws2tcpip.h, ..., sys/utsname.h - не найдены - Ищем 26 включаемых файлов ws2tcpip.h,..., idna.h - Ищем 26 включаемых файлов ws2tcpip.h,..., idna.h - не найдено - LDAP_H не найдено CURL_DISABLE_LDAP установлено ON - LDAP необходимо включить для поддержки LDAPS - Проверить размер size_t - Проверить размер size_t - выполнено - Проверить размер ssize_t - Проверьте размер ssize_t - не удалось - Проверьте размер длинной длинной - Проверьте размер длинной длинной - сделано - Проверьте размер длинной - Проверьте размер длинной - сделано - Проверьте размер короткой - Проверьте размер короткой - сделано - проверить размер int - проверить размер int - выполнено - проверить размер __int64 - проверить размер __int64 - выполнено - проверить размер time_t - проверить размер time_t - выполнено - поиск базового имени - - Поиск базового имени - не найдено - Поиск strncmpi - Поиск strncmpi - не найдено - Поиск тревоги - Поиск тревоги - не найден - Поиск CRYPTO_cleanup_all_ex_data - Поиск CRYPTO_cleanup_all_ex_data - Не найдено - Поиск gethostbyname - Ищу gethostbyname - найдено - Ищу strtoll - Ищу strtoll - найдено - Ищу _strtoi64 - Ищу _strtoi64 - найдено - Ищу strerror_r - Ищу strerror_r - не найдено - Ищу siginterrupt - Ищу siginterrupt - не найдено - Ищу вилку - Ищу вилку - не найдено - Looki ng для freeaddrinfo - Ищете freeaddrinfo - найдено - Ищете freeifaddrs - Ищете freeifaddrs - не найдено - Ищете трубу - Ищете трубу - не найдено - Ищете ftruncate - Ищете ftruncate - не найдено - - Ищу getprotobyname - Ищу getprotobyname - найдено - Ищу getrlimit - Ищу getrlimit - не найдено - Ищу idn_free - Ищу idn_free - не найдено - Ищу idna_strerror - Ищу idna_strerror - не найдено - Ищу tld_strerror - Ищу tld_strerror - не найден - Ищу setlocale - Ищу setlocale - найден - Ищу setrlimit - Ищу setrlimit - не найден - Ищу fcntl - Ищу fcntl - нет найдено - ищу ioctl - ищу ioctl - не найдено - ищу setsockopt - ищу setsockopt - найдено - ищу inet_pton - ищу inet_pton - не найдено - выполнение теста скручивания HAVE_FCNTL_O_NONBLOCK - выполнение теста скручивания HAVE_FCNTL_O_NON BLOCK - Не удалось - выполнение теста скручиваемости HAVE_IOCTLSOCKET - Выполнение теста скручивания HAVE_IOCTLSOCKET - Успех - Выполнение теста скручивания HAVE_IOCTLSOCKET_CAMEL - Выполнение теста скручивания HAVE_IOCTLSOCKET_CAMEL - Ошибка - Выполнение теста скручивания HAVE_IOCCELC_OCT_40C_COTT_COTT_COTT_OILTOCOKTOCTOCTOCTOCTOCTOCTOCTOCTOCTOCTOCTOCK HAVE_IOCTLSOCKET_FIONBIO - Выполнение Curl Test HAVE_IOCTLSOCKET_FIONBIO - Успех - Выполнение Curl Test HAVE_IOCTL_FIONBIO - Выполнение Curl Test HAVE_IOCTL_FIONBIO - Сбой - Выполнение Curl Test HAVE_IOCTL_SIOCGIFADDR - Performing Curl Test HAVE_IOCTL_SIOCGIFADDR - Сбой - Выполнение Curl теста HAVE_SETSOCKOPT_SO_NONBLOCK - Performing Curl Test HAVE_SETSOCKOPT_SO_NONBLOCK - Сбой - выполнение теста скручивания HAVE_SOCKADDR_IN6_SIN6_SCOPE_ID - Выполнение теста скручивания HAVE_SOCKADDR_IN6_SIN6_SCOPE_ID - Сбой - Выполнение теста скручивания HAVE_SOCKLEN_T - Выполнение теста скручивания HAVE_SOCKLEN_T - Успех - Выполнение - выполнение формирование Curl испытания HAVE_BOOL_T - Успех - Выполнение Curl Test HAVE_FILE_OFFSET_BITS - Performing Curl Test HAVE_FILE_OFFSET_BITS - Failed - Performing Curl Test HAVE_GLIBC_STRERROR_R - Performing Curl Test HAVE_GLIBC_STRERROR_R - Failed - Performing Curl Test HAVE_POSIX_STRERROR_R - Performing Curl Test HAVE_POSIX_STRERROR_R - Failed - Проверить размер curl_off_t - Проверить размер curl_off_t - не удалось - Проверить размер socklen_t - Проверить размер socklen_t - выполнено - Выполнить тест curl_cv_recv - Выполнить тест curl_cv_recv - Успешно - Выполнить тест int recv(int, void *, size_t, int) (curl_cv_func_recv_test) - выполнение теста int recv(int, void *, size_t, int) (curl_cv_func_recv_test) - успех - выполнение теста curl_cv_send - выполнение теста curl_cv_send - успех - выполнение теста int send(int, const void *, size_t, int) (curl_cv_func_send_t est) - выполнение теста int send(int, const void *, size_t, int) (curl_cv_func_send_t est) - успех - выполнение теста HAVE_MSG_NOSIGNAL - Выполнение теста HAVE_MSG_NOSIGNAL - Неудачно - Выполнение теста HAVE_STRUCT_TIMEVAL - Выполнение теста HAVE_STRUCT_TIMEVAL - Успешно - Выполнение теста HAVE_POLL_FINE - Выполнение теста HAVE_POLL_FINE - Неудачно - Проверка размера - sig_atomict проверки размера - sig_atomict HAVE_SIG_ATOMIC_T_NOT_VOLATILE - Выполнение теста HAVE_SIG_ATOMIC_T_NOT_VOLATILE - Успех - Проверить размер struct sockaddr_storage - Проверить размер struct sockaddr_storage - не удалось CMake Предупреждение (dev) в каталоге тестов /CMakeLists.txt:1: добавить

C:/Users/jcoffey/main/extlibs/curl-7.35.0/tests/libtest

не содержит файл CMakeLists.txt.

CMake не поддерживает этот случай, но он работал случайно и разрешен для совместимости.

Политика CMP0014 не установлена: входные каталоги должны иметь CMakeLists.txt. Запустите "cmake --help-policy CMP0014" для получения подробной информации о политике. Используйте команду cmake_policy, чтобы установить политику и подавить это предупреждение. Это предупреждение для разработчиков проектов. Используйте -Wno-dev, чтобы подавить его.

CMake Warning (dev) в tests/CMakeLists.txt:2 (add_subdirectory):
Исходный каталог

C:/Users/jcoffey/main/extlibs/curl-7.35.0/tests/server

не содержит файл CMakeLists.txt.

CMake не поддерживает этот случай, но он работал случайно и разрешен для совместимости.

Политика CMP0014 не установлена: входные каталоги должны иметь CMakeLists.txt. Запустите "cmake --help-policy CMP0014" для получения подробной информации о политике. Используйте команду cmake_policy, чтобы установить политику и подавить это предупреждение. Это предупреждение для разработчиков проектов. Используйте -Wno-dev, чтобы подавить его.

- Конфигурирование выполнено - Генерирование выполнено - Файлы сборки были записаны в: C:/Users/jcoffey/main/extlibs/curl-7.35.0-build

Шаг 4: В Visual Studio измените тип цели на x64 с помощью менеджера конфигурации (где мне нужно было выбрать новую платформу, я выбрал X64 и скопировал настройки из Win32). Это довольно простой шаг, который используется для нацеливания на целевую машину X64, чтобы не путать, я не включил пошаговые подробности здесь.

Шаг 5 Выберите решение и пересоберите все из Visual Studio 2013, и вы получите результат, приведенный выше.

Примечание: хотя мне пока не нужен SSL, было бы неплохо узнать, как сообщить CMake, где находится расположение объектов LIBSSL (я скачал пакет предварительно собранных библиотек (32- и 64-битных, включая SSL и другие библиотеки) с http://www.confusedbycode.com/curl/, однако это режим выпуска, и мне нужно иметь возможность отлаживать libCurl, чтобы увидеть, что происходит с некоторыми странными проблемами, с которыми я сталкиваюсь. Новичок, когда дело доходит до настройки CMake, тем не менее, он выглядит действительно многообещающим инструментом для тех из нас, кто ориентирован на несколько платформ, но предпочитает разрабатывать на Windows. Это, безусловно, проще, чем gto autotools.

4 ответа

Решение

Похоже, что созданный CMake файл решения не ожидал, что X64 станет потенциальной целью. Я нашел небольшой вариант по проблеме здесь.

введите описание ссылки здесь

Это изображение параметров командной строки X64 - как вы можете видеть после того, как я изменил менеджер конфигурации для использования X64,

Командная строка - дополнительные параметры используют неверный компьютер 'X86'

Командная строка - дополнительные параметры вручную изменили машину на 'X64'

После внесения этих изменений проект окончательно соединился, и я смог создать отладочную версию библиотеки.

Хитрость для создания 64-битного libcurl на чистой коробке x64 / Win 8.1 / VS2013 заключается в том, чтобы сначала запустить пакетный файл vcvars.bat Visual Studio с аргументом amd64. Это правильно настраивает среду создания.

Затем вы можете запустить команду "nmake...", как описано в winbuild\BUILD.WINDOWS.txt,

У меня такая же проблема (module machine type 'x64' conflicts with target machine type 'X86') при сборке CURL из командной строки в папке "curl-7.40.0\winbuild", как описано в файле "BUILD.WINDOWS.txt". Я использовал следующую командную строку: nmake /f Makefile.vc mode=dll ENABLE_WINSSL=no ENABLE_IDN=no GEN_PDB=yes ENABLE_SSPI=no MACHINE=x64 DEBUG=no, В нем указано "Использование командной оболочки Visual Studio", но... их больше: "Командная строка Visual Studio 2005" не работает, "Командная строка Win64 Visual Studio 2005 x64" (для 64-разрядных систем). У меня это работало с Visual Studio 2005, но говорят, что ему нужен только "Platform SDK".

Поместите этот скрипт в исходный каталог Curl (я назову его winbuild.bat) и запустите его, если вам не нужен проект curl для компиляции с остальной частью вашего решения:

@ECHO OFF
CALL "C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\bin\amd64\vcvars64.bat"
CD winbuild
nmake /f Makefile.vc mode=dll WITH_DEVEL=..\..\dll64 VC=12 WITH_SSL=dll GEN_PDB=yes MACHINE=X64
CD ..
EXIT /B 0
Другие вопросы по тегам