C - Cmake使用libcurl编译程序

时间:2018-04-11 15:06:59

标签: c curl compiler-errors libcurl clion

我正在尝试使用一些curl代码来测试lib,但我无法编译它:(

我正在使用Clion(Cmake + gcc),我有一个libcurl.a,一个libcurl.dll和一个libcurl.dlla 我想用这三个文件做什么?

这是我的CmakeLists.txt:

cmake_minimum_required(VERSION 3.10)
project(curl_test2 C)

set(CMAKE_C_STANDARD 99)

ADD_DEFINITIONS( -DCURL_STATICLIB )
include_directories( "include" )

set(SRCS"
srcs/main.c")
set(HEADERS
    "include/curl/curl.h"
     "include/curl/easy.h")

link_directories("lib")

add_executable(curl_test2 ${SRCS} ${HEADERS})

target_link_libraries(curl_test2 "curl")

这是我的项目:

include
    --curl
        --curl.h
srcs
    --main.c
lib
    --libcurl.a
    (--dlls
        --libcurl.dll
        --libcurl.dlla) <- i'm not using them for now

这是我的main.c(只是一个libcurl示例,不是很重要 - 我只是想编译):

#include <stdio.h>
#include "curl/curl.h"

int main(void)
{
    CURL *curl;
    CURLcode res;

    curl_global_init(CURL_GLOBAL_ALL);

    curl = curl_easy_init();
    if(curl) {
        curl_easy_setopt(curl, CURLOPT_URL, "http://postit.example.com/moo.cgi");
        curl_easy_setopt(curl, CURLOPT_POSTFIELDS, "name=daniel&project=curl");

        res = curl_easy_perform(curl);
        if(res != CURLE_OK)
            fprintf(stderr, "curl_easy_perform() failed: %s\n",
                    curl_easy_strerror(res));

        curl_easy_cleanup(curl);
    }
    curl_global_cleanup();
    return 0;
}

当我尝试构建编译器时会丢弃此错误:“未定义引用`_imp__curl_global_init'”(以及所有其他curl函数调用)

你能帮帮我吗?我有点失落 - 我之前没有真正使用过Cmake ..

谢谢!

1 个答案:

答案 0 :(得分:0)

您链接静态卷曲库(libcurl.a),它需要CURL_STATICLIB定义。在“项目”和“add_executable”命令之间的CMakeLists.txt中添加:

add_denifitions( -DCURL_STATICLIB )

此外,您的文件.dlla不是.dll.a?在这种情况下,.dll.a文件是(我认为)由MinGW工具链生成的,仅当您将dynamicaly与curl库(作为.dll文件)链接时才需要。

我下载了cURL库here的源代码并对其进行了编译(使用Visual Compiler 2015)。它生成我在lib目录中移动的共享库(libcurl.dlllibcurl_imp.lib)(我应该将libcurl_imp.lib重命名为curl.lib)。我还移动了包含目录。

然后,我使用了这个CMakeLists.txt

cmake_minimum_required(VERSION 3.10)
project(curl_test2 C)

set(CMAKE_C_STANDARD 99)

set(SRCS "srcs/main.c")

set( CURL_LIBRARY ${CMAKE_SOURCE_DIR}/lib )
set( CURL_INCLUDE_DIR ${CMAKE_SOURCE_DIR}/include )
find_package( CURL )

include_directories( ${CURL_INCLUDE_DIRS} )
link_directories( ${CURL_LIBRARIES} )

add_executable(curl_test2 ${SRCS})
target_link_libraries(curl_test2 curl)

有了它,您的项目就会编译并执行。

我也尝试过使用cURL静态库(为此,如果使用CMake编译cURL,请在cmake命令行中添加-DCURL_STATICLIB=ON)。我将生成的库libcurl.lib移动到lib\curl.lib

我使用了CMakeLists.txt

cmake_minimum_required(VERSION 3.10)
project(curl_test2 C)

set(CMAKE_C_STANDARD 99)

set(SRCS "srcs/main.c")
add_definitions( -DCURL_STATICLIB )

set( CURL_LIBRARY ${CMAKE_SOURCE_DIR}/lib )
set( CURL_INCLUDE_DIR ${CMAKE_SOURCE_DIR}/include )
find_package( CURL )

include_directories( ${CURL_INCLUDE_DIRS} )
link_directories( ${CURL_LIBRARIES} )

add_executable(curl_test2 ${SRCS})
target_link_libraries(curl_test2 curl wldap32 ws2_32)

它也有效。