g++ libcurl 静态构建在 nghttp2 库上失败

g++ libcurl static build fails on nghttp2 library

我有一个应用程序将 LibCurl 库与 nghttp2 库结合使用,我想静态地 link。

我用来构建的构建命令:

i686-w64-mingw32-g++ -Wall Programm.cpp -o Programm.exe -I/opt/mingw64/Win32/include -L/opt/mingw64/Win32/lib -I/Software -I/Software/Deps -std=c++11 -lgcc -lstdc++ -lnghttp2 -lcurl -lssl -lcrypto -DCURL_STATICLIB -lpthread -lws2_32 -static

它产生的构建错误:

/opt/mingw64/Win32/lib/libcurl.a(libcurl_la-http2.o):http2.c:(.text+0x47): undefined reference to `_imp__nghttp2_session_get_stream_user_data'
/opt/mingw64/Win32/lib/libcurl.a(libcurl_la-http2.o):http2.c:(.text+0x77): undefined reference to `_imp__nghttp2_session_get_stream_user_data'
/opt/mingw64/Win32/lib/libcurl.a(libcurl_la-http2.o):http2.c:(.text+0xaf): undefined reference to `_imp__nghttp2_session_get_stream_user_data'
/opt/mingw64/Win32/lib/libcurl.a(libcurl_la-http2.o):http2.c:(.text+0x448): undefined reference to `_imp__nghttp2_session_get_stream_user_data'
/opt/mingw64/Win32/lib/libcurl.a(libcurl_la-http2.o):http2.c:(.text+0x4ac): undefined reference to `_imp__nghttp2_session_get_stream_user_data'
/opt/mingw64/Win32/lib/libcurl.a(libcurl_la-http2.o):http2.c:(.text+0x5d4): more undefined references to `_imp__nghttp2_session_get_stream_user_data' follow
/opt/mingw64/Win32/lib/libcurl.a(libcurl_la-http2.o):http2.c:(.text+0x6ee): undefined reference to `_imp__nghttp2_session_want_write'
/opt/mingw64/Win32/lib/libcurl.a(libcurl_la-http2.o):http2.c:(.text+0x75e): undefined reference to `_imp__nghttp2_priority_spec_init'
/opt/mingw64/Win32/lib/libcurl.a(libcurl_la-http2.o):http2.c:(.text+0x7e2): undefined reference to `_imp__nghttp2_submit_priority'
/opt/mingw64/Win32/lib/libcurl.a(libcurl_la-http2.o):http2.c:(.text+0x7ef): undefined reference to `_imp__nghttp2_session_send'
/opt/mingw64/Win32/lib/libcurl.a(libcurl_la-http2.o):http2.c:(.text+0x8d3): undefined reference to `_imp__nghttp2_session_del'
/opt/mingw64/Win32/lib/libcurl.a(libcurl_la-http2.o):http2.c:(.text+0x94d): undefined reference to `_imp__nghttp2_session_get_stream_user_data'
/opt/mingw64/Win32/lib/libcurl.a(libcurl_la-http2.o):http2.c:(.text+0xb43): undefined reference to `_imp__nghttp2_submit_rst_stream'
/opt/mingw64/Win32/lib/libcurl.a(libcurl_la-http2.o):http2.c:(.text+0xb4e): undefined reference to `_imp__nghttp2_is_fatal'
/opt/mingw64/Win32/lib/libcurl.a(libcurl_la-http2.o):http2.c:(.text+0xb69): undefined reference to `_imp__nghttp2_session_get_remote_settings'
/opt/mingw64/Win32/lib/libcurl.a(libcurl_la-http2.o):http2.c:(.text+0xcdb): undefined reference to `_imp__nghttp2_submit_rst_stream'
/opt/mingw64/Win32/lib/libcurl.a(libcurl_la-http2.o):http2.c:(.text+0xce4): undefined reference to `_imp__nghttp2_is_fatal'
/opt/mingw64/Win32/lib/libcurl.a(libcurl_la-http2.o):http2.c:(.text+0xda8): undefined reference to `_imp__nghttp2_session_set_stream_user_data'
/opt/mingw64/Win32/lib/libcurl.a(libcurl_la-http2.o):http2.c:(.text+0xe80): undefined reference to `_imp__nghttp2_session_get_stream_user_data'
/opt/mingw64/Win32/lib/libcurl.a(libcurl_la-http2.o):http2.c:(.text+0xeca): undefined reference to `_imp__nghttp2_session_set_stream_user_data'
/opt/mingw64/Win32/lib/libcurl.a(libcurl_la-http2.o):http2.c:(.text+0xf6d): undefined reference to `_imp__nghttp2_session_want_read'
/opt/mingw64/Win32/lib/libcurl.a(libcurl_la-http2.o):http2.c:(.text+0xf87): undefined reference to `_imp__nghttp2_session_want_write'
/opt/mingw64/Win32/lib/libcurl.a(libcurl_la-http2.o):http2.c:(.text+0xfc7): undefined reference to `_imp__nghttp2_session_mem_recv'
/opt/mingw64/Win32/lib/libcurl.a(libcurl_la-http2.o):http2.c:(.text+0x1036): undefined reference to `_imp__nghttp2_strerror'
/opt/mingw64/Win32/lib/libcurl.a(libcurl_la-http2.o):http2.c:(.text+0x11c5): undefined reference to `_imp__nghttp2_http2_strerror'
/opt/mingw64/Win32/lib/libcurl.a(libcurl_la-http2.o):http2.c:(.text+0x1298): undefined reference to `_imp__nghttp2_session_resume_data'
/opt/mingw64/Win32/lib/libcurl.a(libcurl_la-http2.o):http2.c:(.text+0x12ca): undefined reference to `_imp__nghttp2_is_fatal'
/opt/mingw64/Win32/lib/libcurl.a(libcurl_la-http2.o):http2.c:(.text+0x176c): undefined reference to `_imp__nghttp2_submit_request'
/opt/mingw64/Win32/lib/libcurl.a(libcurl_la-http2.o):http2.c:(.text+0x17bb): undefined reference to `_imp__nghttp2_session_send'
/opt/mingw64/Win32/lib/libcurl.a(libcurl_la-http2.o):http2.c:(.text+0x17f9): undefined reference to `_imp__nghttp2_session_resume_data'
/opt/mingw64/Win32/lib/libcurl.a(libcurl_la-http2.o):http2.c:(.text+0x1d0c): undefined reference to `_imp__nghttp2_session_mem_recv'
/opt/mingw64/Win32/lib/libcurl.a(libcurl_la-http2.o):http2.c:(.text+0x1d19): undefined reference to `_imp__nghttp2_is_fatal'
/opt/mingw64/Win32/lib/libcurl.a(libcurl_la-http2.o):http2.c:(.text+0x1f9e): undefined reference to `_imp__nghttp2_strerror'
/opt/mingw64/Win32/lib/libcurl.a(libcurl_la-http2.o):http2.c:(.text+0x2037): undefined reference to `_imp__nghttp2_session_callbacks_new'
/opt/mingw64/Win32/lib/libcurl.a(libcurl_la-http2.o):http2.c:(.text+0x2071): undefined reference to `_imp__nghttp2_session_callbacks_set_send_callback'
/opt/mingw64/Win32/lib/libcurl.a(libcurl_la-http2.o):http2.c:(.text+0x2086): undefined reference to `_imp__nghttp2_session_callbacks_set_on_frame_recv_callback'
/opt/mingw64/Win32/lib/libcurl.a(libcurl_la-http2.o):http2.c:(.text+0x209b): undefined reference to `_imp__nghttp2_session_callbacks_set_on_invalid_frame_recv_callback'
/opt/mingw64/Win32/lib/libcurl.a(libcurl_la-http2.o):http2.c:(.text+0x20b0): undefined reference to `_imp__nghttp2_session_callbacks_set_on_data_chunk_recv_callback'
/opt/mingw64/Win32/lib/libcurl.a(libcurl_la-http2.o):http2.c:(.text+0x20c5): undefined reference to `_imp__nghttp2_session_callbacks_set_before_frame_send_callback'
/opt/mingw64/Win32/lib/libcurl.a(libcurl_la-http2.o):http2.c:(.text+0x20da): undefined reference to `_imp__nghttp2_session_callbacks_set_on_frame_send_callback'
/opt/mingw64/Win32/lib/libcurl.a(libcurl_la-http2.o):http2.c:(.text+0x20ef): undefined reference to `_imp__nghttp2_session_callbacks_set_on_frame_not_send_callback'
/opt/mingw64/Win32/lib/libcurl.a(libcurl_la-http2.o):http2.c:(.text+0x2104): undefined reference to `_imp__nghttp2_session_callbacks_set_on_stream_close_callback'
/opt/mingw64/Win32/lib/libcurl.a(libcurl_la-http2.o):http2.c:(.text+0x2119): undefined reference to `_imp__nghttp2_session_callbacks_set_on_begin_headers_callback'
/opt/mingw64/Win32/lib/libcurl.a(libcurl_la-http2.o):http2.c:(.text+0x212e): undefined reference to `_imp__nghttp2_session_callbacks_set_on_header_callback'
/opt/mingw64/Win32/lib/libcurl.a(libcurl_la-http2.o):http2.c:(.text+0x2143): undefined reference to `_imp__nghttp2_session_callbacks_set_error_callback'
/opt/mingw64/Win32/lib/libcurl.a(libcurl_la-http2.o):http2.c:(.text+0x215e): undefined reference to `_imp__nghttp2_session_client_new'
/opt/mingw64/Win32/lib/libcurl.a(libcurl_la-http2.o):http2.c:(.text+0x216d): undefined reference to `_imp__nghttp2_session_callbacks_del'
/opt/mingw64/Win32/lib/libcurl.a(libcurl_la-http2.o):http2.c:(.text+0x21b7): undefined reference to `_imp__nghttp2_session_get_stream_user_data'
/opt/mingw64/Win32/lib/libcurl.a(libcurl_la-http2.o):http2.c:(.text+0x21e7): undefined reference to `_imp__nghttp2_session_get_stream_user_data'
/opt/mingw64/Win32/lib/libcurl.a(libcurl_la-http2.o):http2.c:(.text+0x22bc): undefined reference to `_imp__nghttp2_version'
/opt/mingw64/Win32/lib/libcurl.a(libcurl_la-http2.o):http2.c:(.text+0x22f2): undefined reference to `_imp__nghttp2_http2_strerror'
/opt/mingw64/Win32/lib/libcurl.a(libcurl_la-http2.o):http2.c:(.text+0x2510): undefined reference to `_imp__nghttp2_session_set_stream_user_data'
/opt/mingw64/Win32/lib/libcurl.a(libcurl_la-http2.o):http2.c:(.text+0x2555): undefined reference to `_imp__nghttp2_submit_rst_stream'
/opt/mingw64/Win32/lib/libcurl.a(libcurl_la-http2.o):http2.c:(.text+0x2631): undefined reference to `_imp__nghttp2_pack_settings_payload'
/opt/mingw64/Win32/lib/libcurl.a(libcurl_la-http2.o):http2.c:(.text+0x2751): undefined reference to `_imp__nghttp2_session_resume_data'
/opt/mingw64/Win32/lib/libcurl.a(libcurl_la-http2.o):http2.c:(.text+0x298c): undefined reference to `_imp__nghttp2_submit_settings'
/opt/mingw64/Win32/lib/libcurl.a(libcurl_la-http2.o):http2.c:(.text+0x29bd): undefined reference to `_imp__nghttp2_session_set_local_window_size'
/opt/mingw64/Win32/lib/libcurl.a(libcurl_la-http2.o):http2.c:(.text+0x2a41): undefined reference to `_imp__nghttp2_session_upgrade'
/opt/mingw64/Win32/lib/libcurl.a(libcurl_la-http2.o):http2.c:(.text+0x2a54): undefined reference to `_imp__nghttp2_strerror'
/opt/mingw64/Win32/lib/libcurl.a(libcurl_la-http2.o):http2.c:(.text+0x2a85): undefined reference to `_imp__nghttp2_strerror'
/opt/mingw64/Win32/lib/libcurl.a(libcurl_la-http2.o):http2.c:(.text+0x2ab5): undefined reference to `_imp__nghttp2_strerror'
/opt/mingw64/Win32/lib/libcurl.a(libcurl_la-http2.o):http2.c:(.text+0x2afb): undefined reference to `_imp__nghttp2_session_set_stream_user_data'
/opt/mingw64/Win32/lib/libcurl.a(libcurl_la-http2.o):http2.c:(.text+0x2b49): undefined reference to `_imp__nghttp2_session_mem_recv'
/opt/mingw64/Win32/lib/libcurl.a(libcurl_la-http2.o):http2.c:(.text+0x2b54): undefined reference to `_imp__nghttp2_is_fatal'
/opt/mingw64/Win32/lib/libcurl.a(libcurl_la-http2.o):http2.c:(.text+0x2b88): undefined reference to `_imp__nghttp2_strerror'
/opt/mingw64/Win32/lib/libcurl.a(libcurl_la-http2.o):http2.c:(.text+0x2bb5): undefined reference to `_imp__nghttp2_strerror'
collect2: error: ld returned 1 exit status

我已经使用以下命令构建了 nghttp2:

wget https://github.com/nghttp2/nghttp2/releases/download/v1.27.0/nghttp2-1.27.0.tar.gz
tar xf nghttp2-1.27.0.tar.gz
cd nghttp2-1.27.0/
./configure --host=i686-w64-mingw32 --prefix=/opt/mingw64/Win32
make
make install

那么,使用 nghttp2 库查看静态 linking LibCurl 的构建命令有什么问题?

issue 在 github 上的解决方案:

./buildconf
CPPFLAGS="-DNGHTTP2_STATICLIB" LDFLAGS="-static" PKG_CONFIG="pkg-config -- 
static" ./configure --enable-static ......
make curl_LDFLAGS=-all-static V=1
make curl_LDFLAGS=-all-static install V=1

谢谢Jay