我有一个简单的C++项目设置,我正在尝试使用CMake进行编译,并且我试图静态链接到libcurl。在我的main.cpp
中,我已经获得了标准的curl_easy_init
示例代码,并且我只是想发送一个简单的请求来确保库正在工作。但是,我在每个cURL函数调用中都收到未定义的引用错误。在我的CMakeLists.txt中,我正在检查当前平台,然后从该特定if语句链接正确的库。下面是我的错误日志,main.cpp和CMakeLists.txt。 我唯一的问题是如何让我的libcurl正确链接,因为我不认为它是现在,因为我的二进制只有72KB,当我实际上可以编译去除cURL特定的代码但留下头文件。除了显而易见的事情之外,我尝试过的一件事是--enable-stdcall-fixup
链接器标志,它根本不起作用。C++将静态库添加到CMake项目导致未定义的引用
错误日志:
C:\Users\bfsco\AppData\Local\JetBrains\Toolbox\apps\CLion\ch-0\163.13906.4\bin\cmake\bin\cmake.exe --build D:\Programming\CPP\cppackage\cmake-build-debug --target all -- -j 4
[ 50%] Linking CXX executable cppackage.exe
CMakeFiles\cppackage.dir/objects.a(main.cpp.obj): In function `main':
D:/Programming/CPP/cppackage/main.cpp:6: undefined reference to `curl_easy_init'
D:/Programming/CPP/cppackage/main.cpp:10: undefined reference to `curl_easy_setopt'
D:/Programming/CPP/cppackage/main.cpp:11: undefined reference to `curl_easy_perform'
D:/Programming/CPP/cppackage/main.cpp:13: undefined reference to `curl_easy_cleanup'
collect2.exe: error: ld returned 1 exit status
mingw32-make.exe[2]: *** [cppackage.exe] Error 1
CMakeFiles\cppackage.dir\build.make:98: recipe for target 'cppackage.exe' failed
mingw32-make.exe[1]: *** [CMakeFiles/cppackage.dir/all] Error 2
CMakeFiles\Makefile2:66: recipe for target 'CMakeFiles/cppackage.dir/all' failed
mingw32-make.exe: *** [all] Error 2
Makefile:82: recipe for target 'all' failed
main.cpp中:
#include <iostream>
#include "include/curl/curl.h"
int main() {
CURL *curl = curl_easy_init();
if(curl) {
CURLcode res;
curl_easy_setopt(curl, CURLOPT_URL, "http://example.com");
res = curl_easy_perform(curl);
std::cout << res << std::endl;
curl_easy_cleanup(curl);
}
std::cout << "Hello, World!" << std::endl;
return 0;
}
的CMakeLists.txt:
cmake_minimum_required(VERSION 3.6)
project(cppackage)
set(CMAKE_CXX_STANDARD 14)
set(SOURCE_FILES main.cpp)
include_directories(${CMAKE_SOURCE_DIR}/include/curl)
add_executable(${PROJECT_NAME} ${SOURCE_FILES})
if(WIN32)
add_definitions(-DCURL_STATICLIB)
target_link_libraries(cppackage ${CMAKE_SOURCE_DIR}/thirdparty/openssl/openssl.lib ${CMAKE_SOURCE_DIR}/thirdparty/curl/libcurl.lib)
else()
target_link_libraries(cppackage ${CMAKE_SOURCE_DIR}/thirdparty/curl/libcurl.a)
endif()
将'VERBOSE = 1'添加到您的命令行以查看生成的链接命令 – Antonio