我正在使用 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 时,项目构建正常,但我宁愿将所有内容构建到一个二进制文件中。有人可以告诉我这有什么问题吗?
你需要定义CURL_STATICLIB
当包含curl.h时,否则编译器会认为您正在尝试链接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)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)