Ошибки при связывании статического cURL с использованием CMake - PullRequest
0 голосов
/ 23 мая 2018

Я пытаюсь создать пример программы, которая использует библиотеку 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

и после завершения сборки у меня есть структура dUR cURL в $ {HOME} /Source/curl-7.59.0:

/bin
/include
/lib    <-- here are libcurl.a and libcurl.la 
/share

4) Затем я подготовил пример, который я получил из simple.c (пример cURL из / docs / examples):

#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%] Связывание исполняемого файла CXX 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: добавление строки "add_definitions (-DCURL_STATICLIB) "на CMakeLists.txt не имеет никакого эффекта.

Спасибо.

1 Ответ

0 голосов
/ 03 марта 2019

Добавить строку в CMakelists.txt:

link_libraries(z)

ref: https://blog.csdn.net/bright789/article/details/84523298

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...