1

I have an application which uses the LibCurl library in combination with the nghttp2-library which I would like to statically link.

The build command I use to build:

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

The build-errors it produces:

/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

I have built nghttp2 with the following commands:

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

So, what is wrong with the build command looking at static linking LibCurl with the nghttp2 library?

TVA van Hesteren
  • 1,031
  • 3
  • 20
  • 47
  • It looks like there is a dynamic linking. Are you sure nghttp2 library is statically built? – miradham Nov 23 '17 at 08:27
  • If your nghttp2 is statically built and you can see those symbols in `libnghttp2.a`, maybe you can try to add `-lnghttp2` twice in your command (before some libs, and then again after some other libs). – pptaszni Nov 23 '17 at 08:37
  • @miradham. No, I guess so but how can I verify this? I have the `libnghttp2.a` file which makes me think that I have a static build? – TVA van Hesteren Nov 23 '17 at 09:00
  • @miradham I have added the nghttp2 build command in my question – TVA van Hesteren Nov 23 '17 at 09:12
  • Can you try -DCURL_STATICLIB $(curl-config --static-libs)? it looks libcurl is trying dynamic linking – miradham Nov 23 '17 at 09:17
  • You need to check if libcurl is built statically as well. For this you need to use --enable-static when you configure libcurl build – miradham Nov 23 '17 at 09:23
  • @miradham, my Libcurl build is static. It has build both dynamic and static – TVA van Hesteren Nov 23 '17 at 09:24
  • @miradham. I have rebuild the nghttp2 library pure statically (--disable-shared --enable-static). Still the same errors occur. how should I use the -DCURL_STATICLIB option looking at the other links? Which ones should I remove from the build command? – TVA van Hesteren Nov 23 '17 at 10:16
  • In my understanding your libcurl tries to link nghttp dynamically. please build libcurl as well with --enable-static command. Then when you build your program use -DCURL_STATICLIB $(curl-config --static-libs). That should give you a different error at least. – miradham Nov 23 '17 at 10:21
  • @miradham. I tried to build lib curl with the -DCURL_STATICLIB $(curl-config --static-libs) which returns me `cannot find -lz` – TVA van Hesteren Nov 23 '17 at 10:21
  • When I try to build Libcurl statically only (--disable-shared --enable-static) it is also returning me `undefined reference to `_imp__nghttp2*'` while I have just build the `nghttp2` library statically. How is this possible? – TVA van Hesteren Nov 23 '17 at 10:30

1 Answers1

3

Solution from issue on 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

Thanks Jay.

Stephen Rauch
  • 47,830
  • 31
  • 106
  • 135