curl - 使用 CMake 链接静态 cURL 时出错
问题描述
我正在尝试构建使用 cURL 库的示例程序。不幸的是,我在链接过程中遇到了很多错误。
系统:Linux-x86_64,GCC 版本 7.2.2
1)因为需要 SSL 支持,所以我首先构建了 OpenSSL 库。我下载了 openssl-1.1.1-pre5.tar.gz,解压并配置为静态构建:
$ ./Configure --prefix="${HOME}/Source/openssl-1.1.1-pre5" no-shared linux-x86_64
然后
$ make VERBOSE=1
$ make install
2)接下来,我准备了ZLib库:下载zlib-1.2.11.tar.gz,解压并配置为静态构建:
$ ./configure --prefix="${HOME}/Source/zlib-1.2.11" --static
然后
$ make VERBOSE=1
$ make install
3)然后我建立了cURL,也作为静态库:
$ ./configure --prefix="${HOME}/Source/curl-7.59.0" --with-ssl="${HOME}/Source/openssl-1.1.1-pre5" --with-zlib="${HOME}/Source/zlib-1.2.11" --enable-static --disable-shared
...配置摘要:
curl version: 7.59.0
Host setup: x86_64-pc-linux-gnu
Install prefix: /home/sergei/Source/curl-7.59.0
Compiler: gcc
SSL support: enabled (OpenSSL)
SSH support: no (--with-libssh2)
zlib support: enabled
brotli support: no (--with-brotli)
GSS-API support: no (--with-gssapi)
TLS-SRP support: enabled
resolver: POSIX threaded
IPv6 support: enabled
Unix sockets support: enabled
IDN support: no (--with-{libidn2,winidn})
Build libcurl: Shared=no, Static=yes
Built-in manual: enabled
--libcurl option: enabled (--disable-libcurl-option)
Verbose errors: enabled (--disable-verbose)
SSPI support: no (--enable-sspi)
ca cert bundle: /etc/ssl/certs/ca-certificates.crt
ca cert path: no
ca fallback: no
LDAP support: no (--enable-ldap / --with-ldap-lib / --with-lber-lib)
LDAPS support: no (--enable-ldaps)
RTSP support: enabled
RTMP support: no (--with-librtmp)
metalink support: no (--with-libmetalink)
PSL support: no (libpsl not found)
HTTP2 support: disabled (--with-nghttp2)
Protocols: DICT FILE FTP FTPS GOPHER HTTP HTTPS IMAP IMAPS POP3 POP3S RTSP SMB SMBS SMTP SMTPS TELNET TFTP
然后
$ make VERBOSE=1
$ make install
构建完成后,我在 ${HOME}/Source/curl-7.59.0 中有 cURL 目录结构:
/bin
/include
/lib <-- here are libcurl.a and libcurl.la
/share
4)接下来我准备了从 simple.c 获得的示例(来自 /docs/examples 的 cURL 示例):
#include <iostream>
#include <stdio.h>
#define CURL_STATICLIB
#include <curl/curl.h>
int main(int argc, char** argv)
{
CURL *curl;
CURLcode res;
curl = curl_easy_init();
if(curl)
{
curl_easy_setopt(curl, CURLOPT_URL, "http://rambler.ru");
/* example.com is redirected, so we tell libcurl to follow redirection */
curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1L);
/* Perform the request, res will get the return code */
res = curl_easy_perform(curl);
/* Check for errors */
if(res != CURLE_OK)
fprintf(stderr, "curl_easy_perform() failed: %s\n",
curl_easy_strerror(res));
/* always cleanup */
curl_easy_cleanup(curl);
}
return 0;
}
写了 CMakeLists.txt:
cmake_minimum_required(VERSION 2.8)
project(curl_example)
set(SOURCE_EXE main.cpp)
add_library(curl_library STATIC IMPORTED)
set_target_properties(curl_library PROPERTIES IMPORTED_LOCATION
"/home/sergei/Source/curl-7.59.0/lib/libcurl.a")
include_directories("/home/sergei/Source/curl-7.59.0/include")
add_executable(main ${SOURCE_EXE})
target_link_libraries(main curl_library)
当我尝试构建时,我遇到了很多错误(在“[100%] Linking CXX executable main”行之后),如下所示:
/home/sergei/Source/curl-7.59.0/lib/libcurl.a(libcurl_la-version.o): In function `curl_version.part.0':
version.c:(.text+0x68): undefined reference to `zlibVersion'
/home/sergei/Source/curl-7.59.0/lib/libcurl.a(libcurl_la-version.o): In function `curl_version_info.part.1':
version.c:(.text+0xde): undefined reference to `zlibVersion'
/home/sergei/Source/curl-7.59.0/lib/libcurl.a(libcurl_la-content_encoding.o): In function `gzip_init_writer':
content_encoding.c:(.text+0x230): undefined reference to `zlibVersion'
content_encoding.c:(.text+0x266): undefined reference to `inflateInit2_'
content_encoding.c:(.text+0x289): undefined reference to `inflateInit2_'
/home/sergei/Source/curl-7.59.0/lib/libcurl.a(libcurl_la-content_encoding.o): In function `exit_zlib':
content_encoding.c:(.text+0x31c): undefined reference to `inflateEnd'
/home/sergei/Source/curl-7.59.0/lib/libcurl.a(libcurl_la-content_encoding.o): In function `inflate_stream':
content_encoding.c:(.text+0x435): undefined reference to `inflate'
content_encoding.c:(.text+0x4eb): undefined reference to `inflateEnd'
content_encoding.c:(.text+0x504): undefined reference to `inflateInit2_'
像这样:
openssl.c:(.text+0x4ae): undefined reference to `SSL_get_error'
openssl.c:(.text+0x4c3): undefined reference to `ERR_get_error'
openssl.c:(.text+0x553): undefined reference to `ERR_error_string_n'
/home/sergei/Source/curl-7.59.0/lib/libcurl.a(libcurl_la-openssl.o): In function `ssl_ui_writer':
openssl.c:(.text+0x8e0): undefined reference to `UI_get_string_type'
openssl.c:(.text+0x8f0): undefined reference to `UI_get0_user_data'
openssl.c:(.text+0x8fd): undefined reference to `UI_get_input_flags'
openssl.c:(.text+0x906): undefined reference to `UI_OpenSSL'
openssl.c:(.text+0x90e): undefined reference to `UI_method_get_writer'
你能帮我吗:我做错了什么?
PS:在 CMakeLists.txt 中添加“add_definitions(-DCURL_STATICLIB)”行无效。
谢谢。
解决方案
在 CMakelists.txt 中添加一行:
link_libraries(z)
参考:https ://blog.csdn.net/bright789/article/details/84523298
推荐阅读
- ubuntu - 如何从 PDF 文件中删除流/对象?
- python - AttributeError:“系列”对象没有属性“合并”
- python - 运行 docker 时无法将“app.server”解析为属性名称或函数调用
- html - 我无法使用我使用 HTML 和 CSS 制作的 github 页面发布我的网站
- python - 我无法使用“枕头”的“裁剪”来剪切图像
- firebase-cloud-messaging - 同一域上的多个 TWA 上的 FCM 推送通知
- google-cloud-dataflow - 如何限制使用 FileIO 写入的每个文件的行数
- database - cloud spanner IAM权限,限制对数据库的访问
- javascript - 在 React 中通过 onClick 更改元素的 className 会触发重新渲染,但条件 className 构造不会?
- flutter - 如何将 suffixIcon 对齐到多行 TextField 的顶部?