将项目与静态构建的curl链接

7

我正在使用CMake和MinGW32进行一项小型的C++项目,需要使用libcurl库,但是当我尝试链接静态构建的libcurl.a时,出现了未定义引用错误。

undefined reference to `_imp__curl_easy_init'
undefined reference to `_imp__curl_easy_setopt'
undefined reference to `_imp__curl_easy_perform'
undefined reference to `_imp__curl_easy_getinfo'
undefined reference to `_imp__curl_easy_strerror'

我有cURL源代码在dep/curl文件夹中,我的源代码在src文件夹中。以下是我的项目CMakeLists.txt的内容:

project(ShutdownServer)
cmake_minimum_required(VERSION 2.8)
set(CMAKE_BUILD_TYPE "Release")
set(CURL_STATICLIB true)
set(BUILD_CURL_EXE false)

add_subdirectory(dep/curl)
set(TARGET_NAME "ShutdownServer")
set(LIBCURL_DIR ${PROJECT_SOURCE_DIR}/dep/curl)

aux_source_directory(src SRC_LIST)
add_executable(${TARGET_NAME} ${SRC_LIST})

find_path(LIBCURL_INCLUDE_DIR curl/curl.h HINTS ${LIBCURL_DIR}/include)
include_directories(${LIBCURL_INCLUDE_DIR})

add_dependencies(${TARGET_NAME} libcurl)

set(LIBS ${LIBS} ws2_32)
set(LIBS ${LIBS} iphlpapi)
set(LIBS ${LIBS} libcurl)

target_link_libraries(${TARGET_NAME} ${LIBS})

set(CMAKE_EXE_LINKER_FLAGS "-static -static-libgcc -static-libstdc++")

当我将CURL_STATICLIB选项切换为false,并动态构建libcurl时,项目可以成功构建,但我更希望将所有内容构建到一个二进制文件中。请问有什么问题吗?

1个回答

15

在包含curl.h时,您需要定义CURL_STATICLIB,否则编译器会认为您正在尝试链接动态版本的libcurl库。

如果您查看curl.h,您会看到以下几行:

/*
 * Decorate exportable functions for Win32 DLL linking.
 * This avoids using a .def file for building libcurl.dll.
 */
#if (defined(WIN32) || defined(_WIN32)) && !defined(CURL_STATICLIB)
#if defined(BUILDING_LIBCURL)
#define CURL_EXTERN  __declspec(dllexport)
#else
#define CURL_EXTERN  __declspec(dllimport)
#endif
#else

你可以看到,默认情况下,每个函数都是使用 __declspec(dllimport) 声明的,这会在符号名称上添加那些 _imp__ 前缀。

所以你需要在你的 CMakeLists.txt 文件中定义 CURL_STATICLIB,像这样:

add_definitions(-DCURL_STATICLIB)

1
谢谢你!我到处搜索,但是直到我找到这个问题/答案才找到有用的东西。 - Boy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接