将项目链接到静态构建curl 我在C++中使用CMake和MIW32做了一个小项目,它需要LIbCURL库,但是当我试图链接静态构建LBCURL.A时,我得到了未定义的引用错误

将项目链接到静态构建curl 我在C++中使用CMake和MIW32做了一个小项目,它需要LIbCURL库,但是当我试图链接静态构建LBCURL.A时,我得到了未定义的引用错误,c++,curl,cmake,mingw32,C++,Curl,Cmake,Mingw32,我在dep/cURL中有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 "

我在dep/cURL中有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.h时,您需要定义
CURL\u 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
您可以看到,默认情况下,每个函数都使用
\u declspec(dllimport)
约定声明,该约定在符号名称上添加这些前缀

因此,您需要在CMakeLists.txt中定义CURL_STATICLIB,如下所示:

add_definitions(-DCURL_STATICLIB)

谢谢你,伙计!我到处都找遍了,但在找到这个问题/答案之前找不到任何有用的东西。
add_definitions(-DCURL_STATICLIB)