C - Cmake 使用 libcurl 编译程序
C - Cmake compiling program with libcurl
我正在尝试使用一些 curl 代码来测试库,但我无法编译它:(
我正在使用 Clion (Cmake + gcc),我有一个 libcurl.a、一个 libcurl.dll 和一个 libcurl.dlla
我应该如何处理这 3 个文件?
这是我的 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;
}
当我尝试构建编译器时删除此错误:"undefined reference to `_imp__curl_global_init'"(以及所有其他 curl 函数调用)
你能帮帮我吗?我有点迷茫-我以前并没有真正使用过Cmake..
谢谢!
您 link 使用需要 CURL_STATICLIB 定义的静态 curl 库 (libcurl.a)。在 "project" 和 "add_executable" 命令之间的 CMakeLists.txt 中添加:
add_definitions( -DCURL_STATICLIB )
另外,你的.dlla文件不是.dll.a?在这种情况下,.dll.a 文件(我认为)是由 MinGW 工具链生成的,只有当您 link 动态使用 curl 库(作为 .dll 文件)时才需要。
我下载了 cURL 库的源代码 here 并编译了它(使用 Visual Compiler 2015)。它生成我在 lib 目录中移动的共享库(libcurl.dll
和 libcurl_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)
它也有效。
我正在尝试使用一些 curl 代码来测试库,但我无法编译它:(
我正在使用 Clion (Cmake + gcc),我有一个 libcurl.a、一个 libcurl.dll 和一个 libcurl.dlla 我应该如何处理这 3 个文件?
这是我的 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;
}
当我尝试构建编译器时删除此错误:"undefined reference to `_imp__curl_global_init'"(以及所有其他 curl 函数调用)
你能帮帮我吗?我有点迷茫-我以前并没有真正使用过Cmake..
谢谢!
您 link 使用需要 CURL_STATICLIB 定义的静态 curl 库 (libcurl.a)。在 "project" 和 "add_executable" 命令之间的 CMakeLists.txt 中添加:
add_definitions( -DCURL_STATICLIB )
另外,你的.dlla文件不是.dll.a?在这种情况下,.dll.a 文件(我认为)是由 MinGW 工具链生成的,只有当您 link 动态使用 curl 库(作为 .dll 文件)时才需要。
我下载了 cURL 库的源代码 here 并编译了它(使用 Visual Compiler 2015)。它生成我在 lib 目录中移动的共享库(libcurl.dll
和 libcurl_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)
它也有效。