将 libcurl+openssl 静态链接到我的项目时出现链接器错误
我正在尝试静态链接 libcurl (使用 SSL)进入我的项目,但我遇到了很多链接器错误:
../lib/libcrypto.a(rand_win.o):rand_win.c:(.text+0xa9c): undefined reference to `CreateDCA@16'
../lib/libcrypto.a(rand_win.o):rand_win.c:(.text+0xaa9): undefined reference to `CreateCompatibleDC@4'
../lib/libcrypto.a(rand_win.o):rand_win.c:(.text+0xaba): undefined reference to `GetDeviceCaps@8'
../lib/libcrypto.a(rand_win.o):rand_win.c:(.text+0xaca): undefined reference to `GetDeviceCaps@8'
../lib/libcrypto.a(rand_win.o):rand_win.c:(.text+0xae0): undefined reference to `CreateCompatibleBitmap@12'
../lib/libcrypto.a(rand_win.o):rand_win.c:(.text+0xaee): undefined reference to `SelectObject@8'
../lib/libcrypto.a(rand_win.o):rand_win.c:(.text+0xb00): undefined reference to `GetObjectA@12'
../lib/libcrypto.a(rand_win.o):rand_win.c:(.text+0xb71): undefined reference to `BitBlt@36'
../lib/libcrypto.a(rand_win.o):rand_win.c:(.text+0xb7b): undefined reference to `GetBitmapBits@12'
../lib/libcrypto.a(rand_win.o):rand_win.c:(.text+0xbd2): undefined reference to `SelectObject@8'
../lib/libcrypto.a(rand_win.o):rand_win.c:(.text+0xbd9): undefined reference to `DeleteObject@4'
../lib/libcrypto.a(rand_win.o):rand_win.c:(.text+0xbe3): undefined reference to `DeleteDC@4'
../lib/libcrypto.a(rand_win.o):rand_win.c:(.text+0xbed): undefined reference to `DeleteDC@4'
../lib/librtmp.a(rtmp.o):rtmp.c:(.text+0x1b3b): undefined reference to `inet_addr@4'
../lib/librtmp.a(rtmp.o):rtmp.c:(.text+0x1ba4): undefined reference to `inet_addr@4'
../lib/librtmp.a(rtmp.o):rtmp.c:(.text+0x5d1e): undefined reference to `htonl@4'
../lib/librtmp.a(rtmp.o):rtmp.c:(.text+0x5eed): undefined reference to `ntohl@4'
../lib/librtmp.a(rtmp.o):rtmp.c:(.text+0x6f9a): undefined reference to `htonl@4'
../lib/librtmp.a(rtmp.o):rtmp.c:(.text+0x728d): undefined reference to `htonl@4'
../lib/librtmp.a(rtmp.o):rtmp.c:(.text+0x732c): undefined reference to `htonl@4'
../lib/librtmp.a(rtmp.o):rtmp.c:(.text+0x757f): undefined reference to `ntohl@4'
../lib/librtmp.a(rtmp.o):rtmp.c:(.text+0xb45): undefined reference to `timeGetTime@0'
这是我下载的 lib folfer 中的文件列表。
有人告诉我应该定义宏 CURL_STATICLIB
并链接到 wsock32
和 wldap32
。还有什么我应该做的吗?
我正在使用 MinGW 和 Eclipse。
g++ -DCURL_STATICLIB -DUSE_LIBSSH2 -DHAVE_LIBSSH2 -DCURL_DISABLE_LDAP -DHAVE_LIBSSH2_H -DLIBSSH2_WIN32 -DLIBSSH2_LIBRARY -DUSE_SSLEAY -O0 -g3 -Wall -c -fmessage-length=0 -osrc\CURLDown.o ..\src\CURLDown.cpp
g++ -L../lib -oCURLDown.exe src\CURLDown.o -lcurl -lcrypto -lwsock32 -lwldap32 -leay32 -lidn -lrtmp -lssh2 -lz -lssl32 -lssl
I am trying to statically link libcurl (with SSL) into my project, but I am encountering lots of linker errors:
../lib/libcrypto.a(rand_win.o):rand_win.c:(.text+0xa9c): undefined reference to `CreateDCA@16'
../lib/libcrypto.a(rand_win.o):rand_win.c:(.text+0xaa9): undefined reference to `CreateCompatibleDC@4'
../lib/libcrypto.a(rand_win.o):rand_win.c:(.text+0xaba): undefined reference to `GetDeviceCaps@8'
../lib/libcrypto.a(rand_win.o):rand_win.c:(.text+0xaca): undefined reference to `GetDeviceCaps@8'
../lib/libcrypto.a(rand_win.o):rand_win.c:(.text+0xae0): undefined reference to `CreateCompatibleBitmap@12'
../lib/libcrypto.a(rand_win.o):rand_win.c:(.text+0xaee): undefined reference to `SelectObject@8'
../lib/libcrypto.a(rand_win.o):rand_win.c:(.text+0xb00): undefined reference to `GetObjectA@12'
../lib/libcrypto.a(rand_win.o):rand_win.c:(.text+0xb71): undefined reference to `BitBlt@36'
../lib/libcrypto.a(rand_win.o):rand_win.c:(.text+0xb7b): undefined reference to `GetBitmapBits@12'
../lib/libcrypto.a(rand_win.o):rand_win.c:(.text+0xbd2): undefined reference to `SelectObject@8'
../lib/libcrypto.a(rand_win.o):rand_win.c:(.text+0xbd9): undefined reference to `DeleteObject@4'
../lib/libcrypto.a(rand_win.o):rand_win.c:(.text+0xbe3): undefined reference to `DeleteDC@4'
../lib/libcrypto.a(rand_win.o):rand_win.c:(.text+0xbed): undefined reference to `DeleteDC@4'
../lib/librtmp.a(rtmp.o):rtmp.c:(.text+0x1b3b): undefined reference to `inet_addr@4'
../lib/librtmp.a(rtmp.o):rtmp.c:(.text+0x1ba4): undefined reference to `inet_addr@4'
../lib/librtmp.a(rtmp.o):rtmp.c:(.text+0x5d1e): undefined reference to `htonl@4'
../lib/librtmp.a(rtmp.o):rtmp.c:(.text+0x5eed): undefined reference to `ntohl@4'
../lib/librtmp.a(rtmp.o):rtmp.c:(.text+0x6f9a): undefined reference to `htonl@4'
../lib/librtmp.a(rtmp.o):rtmp.c:(.text+0x728d): undefined reference to `htonl@4'
../lib/librtmp.a(rtmp.o):rtmp.c:(.text+0x732c): undefined reference to `htonl@4'
../lib/librtmp.a(rtmp.o):rtmp.c:(.text+0x757f): undefined reference to `ntohl@4'
../lib/librtmp.a(rtmp.o):rtmp.c:(.text+0xb45): undefined reference to `timeGetTime@0'
Here is the list of files in lib folfer that I downloaded.
I was told that I should define the macro CURL_STATICLIB
and link in wsock32
and wldap32
. Is there anything else that I should be doing?
I am using MinGW and Eclipse.
g++ -DCURL_STATICLIB -DUSE_LIBSSH2 -DHAVE_LIBSSH2 -DCURL_DISABLE_LDAP -DHAVE_LIBSSH2_H -DLIBSSH2_WIN32 -DLIBSSH2_LIBRARY -DUSE_SSLEAY -O0 -g3 -Wall -c -fmessage-length=0 -osrc\CURLDown.o ..\src\CURLDown.cpp
g++ -L../lib -oCURLDown.exe src\CURLDown.o -lcurl -lcrypto -lwsock32 -lwldap32 -leay32 -lidn -lrtmp -lssh2 -lz -lssl32 -lssl
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
对于那些在 google 上搜索此答案的人 -
对 `CreateDCA@16' 的未定义引用
链接器错误正在寻找 libgdi.a (只需 -lgdi 即可)。请记住,它必须包含在要链接的库列表中的 libcurl 和 openssl 之后。For those searching for this answer on google - the
undefined reference to `CreateDCA@16'
linker error is looking for libgdi.a (just -lgdi would do). Bear in mind it has to be included after libcurl and openssl in the list of libraries to link.g++ -L../lib -oCURLDown.exe src\CURLDown.o -lcurl -leay32 -lidn -lrtmp -lssh2 -lz -lssl32 -lcrypto
建议您确实没有指定所有库。也许你的 makefile 中有一个拼写错误?
我还看到对位于 Winmm.lib 中的 timeGetTime() 的引用。
libeay32 和 libcrypto 似乎对谁应该定义什么存在误解。可能意外地出现了一个由两个库编译的源文件,而该库只应由一个库编译。
g++ -L../lib -oCURLDown.exe src\CURLDown.o -lcurl -leay32 -lidn -lrtmp -lssh2 -lz -lssl32 -lcrypto
suggests that you really don't specify all libs. Maybe there is a typo in your makefile?
I also see a reference to timeGetTime() which resides in Winmm.lib.
Also libeay32 and libcrypto seem to have a misunderstanding in who should define what. There is probably accidently a sourcefile that is compiled by both libs that should only be compiled by one.