2017-03-08 299 views
1

我有一个简单的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() 
+0

将'VERBOSE = 1'添加到您的命令行以查看生成的链接命令 – Antonio

回答

1

看来你试图将一个从Visual Studio构建的库链接到使用MinGW构建的应用程序。 This is normally not possible。您应该尝试使用MinGW从源代码构建libcurl。


原来的答复:

尝试分开在两个不同的目录/第三方/ curl_win32 2个库版本和/第三方/ curl_2,然后改变你的代码:

if(WIN32) 
    add_definitions(-DCURL_STATICLIB) 
    link_directories("${CMAKE_SOURCE_DIR}/thirdparty/openssl/" "${CMAKE_SOURCE_DIR}/thirdparty/"curl_win32) 
else() 
    link_directories("${CMAKE_SOURCE_DIR}/thirdparty/curl2") 
endif() 

add_executable(${PROJECT_NAME} ${SOURCE_FILES}) 

if(WIN32) 
    target_link_libraries(${PROJECT_NAME} openssl curl) 
else() 
    target_link_libraries(${PROJECT_NAME} curl) 
endif() 

请注意,显然link_directories命令必须位于add_executable命令之前。见here

+0

在此错误中使用该结果: 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%]链接CXX可执行文件cppackage.exe c:/ binaries/mingw/bin /../ lib/gcc/mingw32/5.3.0 /../../../../ mingw32 /bin/ld.exe:找不到-lopenssl c:/ binaries/mingw/bin /../ lib/gcc/mingw32/5.3.0 /../../../../ mingw32/bin/ld.exe:找不到-lcurl collect2.exe:错误:ld返回1退出状态 – Wargog

+0

@Wargog您是否确实在此位置有库? $ {CMAKE_SOURCE_DIR}/thirdparty/curl_win32 ...并且,通过将VERBOSE = 1添加到您的命令行来检查输出。 – Antonio

+0

确定,我确实已经通过了无法找到包的链接,但我仍然收到未找到引用的错误。这是我目前的CMakeLists.txt:http://pastebin.com/CEi8q6JF – Wargog

0

Personnally,我总是用命令 “集”,我通过librairies相对路径,然后将该变量放在target_link_libraries中。

+0

我理解的方式是,如果它是一个编译库,它是我的,它必须是一个显式路径我的情况是.lib文件或.a或.o文件),而不是路径。我很确定使用路径意味着你正在试图在该位置编译库,而我并不是这样。 – Wargog

+0

Mh ...对不起,我给你一个例子:set(CURL_LIB $ {CMAKE_SOURCE_DIR} /thirdparty/curl/libcurl.lib)并在target_link_libraries命令中使用变量&{CURL_LIB}。我有一个项目的相同需求(只是不相同的库),我在3平台上(并通过正确的lib当然) – Zethzer

相关问题