Невозможно скомпилировать curl и libgcc как статическую библиотеку в MinGW / CLion (c ++) - PullRequest
0 голосов
/ 27 мая 2019

Я пытаюсь скомпилировать curl и libgcc как статическую библиотеку, чтобы мне не пришлось включать файлы dll в мою программу. У меня проблемы с libcurl.dll, не найденными при запуске исполняемого файла через командную строку. Также есть еще одна ошибка libgcc_s_dw2-1.dll, не найденная.

Это работает, когда я помещаю dll-файлы в ту же папку, что и исполняемый файл, но это не то, что мне действительно нравится. Я положил -DCURL_STATICLIB в CMAKE_CXX_FLAGS, как предложено здесь:

https://curl.haxx.se/docs/install.html

Вот мой CMakeLists.txt

project(ham)

set(CMAKE_CXX_STANDARD 14)

set(CMAKE_C_FLAGS -m32 -DCURL_STATICLIB)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -m32 -std=c++14 -LC:/curlx86 -lcurl")

set(CMAKE_CXX_STANDARD_LIBRARIES "${CMAKE_CXX_STANDARD_LIBRARIES} -static-libgcc -static-libstdc++ -lwsock32 -lws2_32 -lwinmm")
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,-Bstatic,--whole-archive -Wl,--no-whole-archive")


project(untitled3)
add_executable(ham Ham/ham.cpp)

target_link_libraries(ham "C:/curlx86/libcurl.dll.a")

Я хочу, чтобы моя программа работала без дополнительных файлов DLL. Что мне делать?

Edit Когда я использую target_link_libraries(ham "C:/curlx86/libcurl.dll.a")

Я получаю эти ошибки.

c: / mingw / bin /../ lib / gcc / mingw32 / 8.2.0 /../../../../ mingw32 / bin / ld.exe: C: / curlx86 / libcurl. a (easy.o) :(. text + 0x8f): неопределенная ссылка на libssh2_init' c:/mingw/bin/../lib/gcc/mingw32/8.2.0/../../../../mingw32/bin/ld.exe: C:/curlx86/libcurl.a(easy.o):(.text+0x16b): undefined reference to libssh2_exit ' c: / mingw / bin /../ lib / gcc / mingw32 / 8.2.0 /../../../../ mingw32 / bin / ld.exe: C: /curlx86/libcurl.a (http2 .o) :(. text + 0xcd): неопределенная ссылка на nghttp2_version' c:/mingw/bin/../lib/gcc/mingw32/8.2.0/../../../../mingw32/bin/ld.exe: C:/curlx86/libcurl.a(http2.o):(.text+0x2ca): undefined reference to nghttp2_submit_rst_stream ' c: / mingw / bin /../ lib / gcc / mingw32 / 8.2.0 /../../../../ mingw32 / bin / ld.exe: C: /curlx86/libcurl.a (http2 .o) :(. text + 0x2dc): неопределенная ссылка на nghttp2_session_send' c:/mingw/bin/../lib/gcc/mingw32/8.2.0/../../../../mingw32/bin/ld.exe: C:/curlx86/libcurl.a(http2.o):(.text+0x31d): undefined reference to nghttp2_session_set_stream_user_data ' c: / mingw / bin /../ lib / gcc / mingw32 / 8.2.0 /../../../../ mingw32 / bin / ld.exe: C: /curlx86/libcurl.a (http2 .o) :(. text + 0x3c0): неопределенная ссылка на nghttp2_pack_settings_payload' c:/mingw/bin/../lib/gcc/mingw32/8.2.0/../../../../mingw32/bin/ld.exe: C:/curlx86/libcurl.a(http2.o):(.text+0x4bd): undefined reference to nghttp2_session_resume_data ' c: / mingw / bin /../ lib / gcc / mingw32 / 8.2.0 /../../../../ mingw32 / bin / ld.exe: C: /curlx86/libcurl.a (http2 .o) :(. text + 0x4fe): неопределенная ссылка на nghttp2_session_mem_recv' c:/mingw/bin/../lib/gcc/mingw32/8.2.0/../../../../mingw32/bin/ld.exe: C:/curlx86/libcurl.a(http2.o):(.text+0x51c): undefined reference to nghttp2_strerror ' c: / mingw / bin /../ lib / gcc / mingw32 / 8.2.0 /../../../../ mingw32 / bin / ld.exe: C: /curlx86/libcurl.a (http2 .o) :(. text + 0x5c3): неопределенная ссылка на nghttp2_priority_spec_init' c:/mingw/bin/../lib/gcc/mingw32/8.2.0/../../../../mingw32/bin/ld.exe: C:/curlx86/libcurl.a(http2.o):(.text+0x614): undefined reference to nghttp2_submit_priority ' c: / mingw / bin /../ lib / gcc / mingw32 / 8.2.0 /../../../../ mingw32 / bin / ld.exe: C: /curlx86/libcurl.a (http2 .o) :(. text + 0x621): неопределенная ссылка на `nghttp2_session_send '




1 Ответ

0 голосов
/ 28 мая 2019

Мне потребовался целый день, чтобы понять, но я наконец смог скомпилировать curl с openssl v1.1.1b как статические библиотеки. Любой, кто приходит, может выполнить следующие шаги.

Part1 (настройка openssl v1.1.1b) :

1) Скачать пакет openssl v1.1.1b (не установщик)

2) Скачать и ввести Msys2

3) Открыть msys.exe (не mingw32.exe или mingw.exe)

4) Запустите эту команду для установки perl и других пакетов (без кавычек): "pacman -S make perl msys2-devel libcrypt-devel perl-CPAN mingw-w64-i686-toolchain"

5) Теперь закройте msys.exe и откройте mingw32.exe

6) Перейдите в каталог, куда вы распаковали пакет openssl (в моем случае это) cd "C:\Users\John\Downloads\openssl-1.1.1b\openssl-1.1.1b"

Before continuing further you have to open the files below with any text editor like Notepad++
and add "#include <windows.h>" to each of them, without this you will run into errors:
"C:\Users\John\Downloads\openssl-1.1.1b\openssl-1.1.1b\crypto\dso\dso_win32.c"
"C:\Users\John\Downloads\openssl-1.1.1b\openssl-1.1.1b\crypto\init.c"

7) Выполнить (без кавычек) (это скомпилирует openssl как статическую библиотеку):

"./Configure --prefix=c:/OpenSSLx86 --openssldir=c:/OpenSSLx86 no-threads no-idea no-shared mingw"

8) Выполнить (без кавычек): "make clean"

9) Выполнить (без кавычек): "make depend"

10) Выполнить (без кавычек): "make"

11) Выполнить (без кавычек): "make install"

Part2 (сборка здания с openssl v1.1.1b) :

1) Загрузите и извлеките пакет curl.

2) Перейдите в это место: "C:\Users\John\Downloads\curl\curl-7.65.0\lib\curl_setup.h" и добавьте следующие строки, чтобы уменьшить размер скомпилированной библиотеки и выберите параметры, которые вы будете использовать. Я буду использовать только протокол SMTP, поэтому отключаю других.

#define CURL_DISABLE_TFTP
#define CURL_DISABLE_FTP
#define CURL_DISABLE_LDAP
#define CURL_DISABLE_TELNET
#define CURL_DISABLE_DICT
#define CURL_DISABLE_FILE
#define CURL_DISABLE_RTSP
#define CURL_DISABLE_POP3
#define CURL_DISABLE_IMAP
//#define CURL_DISABLE_SMTP
#define CURL_DISABLE_GOPHER
#define CURL_DISABLE_SMB

3) Перейдите к этим обоим файлам и измените переменную OPENSSL_PATH на "OPENSSL_PATH = C:\OpenSSLx86".

"C:\Users\John\Downloads\curl\curl-7.65.0\lib\Makefile.m32"

"C:\Users\John\Downloads\curl\curl-7.65.0\src\Makefile.m32"

4) Прогон: cd "C:\Users\John\Downloads\curl\curl-7.65.0"

5) Прогон: make mingw32-ssl

6) Теперь скопируйте libcurl.a из C:\Users\John\Downloads\curl\curl-7.65.0\lib в C:\curlx86 и все готово.

Here is my final CMakeLists.txt:

cmake_minimum_required(VERSION 3.3)     #curl
project(ham)

set(CMAKE_CXX_STANDARD 14)

add_compile_definitions(
        CURL_STATICLIB
        WITH_SSL=STATIC
)
#CURL_DISABLE_SMTP

set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -m32")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -m32 -LC:/curlx86 -lcurl -LC:/OpenSSLx86/lib -lssl -LC:/OpenSSLx86/lib -lcrypto")

set(CMAKE_CXX_STANDARD_LIBRARIES "${CMAKE_CXX_STANDARD_LIBRARIES} -static-libgcc -static-libstdc++ -lwsock32 -lws2_32 -lwinmm -lcrypt32")
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,-Bstatic,--whole-archive -lwinpthread -Wl,--no-whole-archive") 


project(untitled3)
add_executable(ham Ham/ham.cpp)

target_link_libraries(ham "C:/curlx86/libcurl.a"  "C:/OpenSSLx86/lib/libssl.a" "C:/OpenSSLx86/lib/libcrypto.a")

...