2014-09-03 109 views
0

我有这个简单的C++代码。C++链接器不能使用外部符号与静态libcurl

#include <iostream> 

#include <windows.h> 
#include <Lmcons.h> 

#define CURL_STATICLIB 

#include <iostream> 
#include <fstream> 
#include <curl.h> 
#include <stdio.h> 

#pragma comment(lib, "ws2_32.lib") 
#pragma comment(lib, "curl\\libeay32.lib") 
#pragma comment(lib, "curl\\openldap.lib") 
#pragma comment(lib, "curl\\ssleay32.lib") 

#if defined _DEBUG 
    #pragma comment(lib, "curl\\lib\\Debug\\curllib_static.lib") 
#else 
    #pragma comment(lib, "curl\\lib\\Release\\curllib_static.lib") 
#endif 

using namespace std; 

int main() 
{ 
    TCHAR name [ UNLEN + 1 ]; 
    DWORD size = UNLEN + 1; 

    if (GetUserName((TCHAR*)name, &size)) 
     wcout << "Hello, " << name << "!\n"; 
    else 
     wcout << "Hello, unnamed person!\n"; 

    CURL *curl; 
    CURLcode res; 

    curl_version(); 


    /* In windows, this will init the winsock stuff */ 
    curl_global_init(CURL_GLOBAL_ALL); 

    /* get a curl handle */ 
    curl = curl_easy_init(); 
    if(curl) { 
    /* First set the URL that is about to receive our POST. This URL can 
     just as well be a https:// URL if that is what should receive the 
     data. */ 
    curl_easy_setopt(curl, CURLOPT_URL, "http://requestb.in/19l9fjg1"); 
    /* Now specify the POST data */ 
    curl_easy_setopt(curl, CURLOPT_POSTFIELDS, "name=daniel&project=curl"); 

    /* Perform the request, res will get the return code */ 
    res = curl_easy_perform(curl); 
    /* Check for errors */ 
    if(res != CURLE_OK) 
     fprintf(stderr, "curl_easy_perform() failed: %s\n", 
       curl_easy_strerror(res)); 

    /* always cleanup */ 
    curl_easy_cleanup(curl); 
    } 
    curl_global_cleanup(); 

    system("PAUSE"); 

    return 0; 
} 

我的目录树。

X 
| app.cpp 
| 
+---curl 
| | CHANGES 
| | curl.exe 
| | curllib.dll 
| | libcurl_imp.lib 
| | libeay32.dll 
| | libeay32.lib 
| | openldap.dll 
| | openldap.lib 
| | README 
| | ssleay32.dll 
| | ssleay32.lib 
| | 
| +---docs 
| | | BINDINGS 
| | | [...] 
| | | VERSIONS 
| | | 
| | +---examples 
| | |  10-at-a-time.c 
| | |  [...] 
| | |  threaded-ssl.c 
| | |  
| | \---libcurl 
| |   ABI 
| |   [...] 
| |   Makefile.in 
| |   
| +---include 
| | | Makefile.am 
| | | [...] 
| | | README 
| | | 
| | \---curl 
| |   curl.h 
| |   [...] 
| |   types.h 
| |   
| +---lib 
| | +---Debug 
| | |  curllib.dll 
| | |  curllib.lib 
| | |  curllib_static.lib 
| | |  
| | \---Release 
| |   curllib.dll 
| |   curllib.lib 
| |   curllib_static.lib 
| |   
| \---src 
|  +---DLL-Debug 
|  |  curl.exe 
|  |  curllib.dll 
|  |  openldap.dll 
|  |  
|  +---DLL-Release 
|  |  curl.exe 
|  |  curllib.dll 
|  |  openldap.dll 
|  |  
|  +---LIB-Debug 
|  |  curl.exe 
|  |  
|  \---LIB-Release 
|    curl.exe 
|    
+---Debug 
|  app.obj 
|  [...] 
|  vc110.pdb 
|  
\---Release 
     app.obj 
     [...] 
     vc110.pdb 

而那就是我的设置。

Linker -> General -> Additional library directories 
    X\curl\lib\Release;X\curl;%(AdditionalLibraryDirectories) 
Linker -> Input -> Additional dependences 
    $(ProjectDir)curl\lib\Debug\curllib_static.lib;%(AdditionalDependencies) 
VC++-Directories -> Include directories 
    $(ProjectDir)curl\include\curl;$(IncludePath) 
VC++-Directories -> Library directories 
    $(ProjectDir)curl\lib\Release;$(LibraryPath) 

** $(PROJECTDIR)是X **

错误。

Error 2 error LNK2005: _calloc already defined in LIBCMT.lib(calloc.obj). X\MSVCRT.lib(MSVCR110.dll) X 
Error 3 error LNK2005: _realloc already defined in LIBCMT.lib(realloc.obj). X\MSVCRT.lib(MSVCR110.dll) X 
Error 4 error LNK2005: _free already defined in LIBCMT.lib(free.obj). X\MSVCRT.lib(MSVCR110.dll) X 
Error 5 error LNK2005: _malloc already defined in LIBCMT.lib(malloc.obj). X\MSVCRT.lib(MSVCR110.dll) X 
Error 6 error LNK2005: _strrchr already defined in LIBCMT.lib(strrchr.obj). X\MSVCRT.lib(MSVCR110.dll) X 
Error 7 error LNK2005: _strchr already defined in LIBCMT.lib(strchr.obj). X\MSVCRT.lib(MSVCR110.dll) X 
Error 8 error LNK2005: _fwrite already defined in LIBCMT.lib(fwrite.obj). X\MSVCRT.lib(MSVCR110.dll) X 
Error 9 error LNK2005: ___iob_func already defined in LIBCMT.lib(_file.obj). X\MSVCRT.lib(MSVCR110.dll) X 
Error 10 error LNK2005: _strtoul already defined in LIBCMT.lib(strtol.obj). X\MSVCRT.lib(MSVCR110.dll) X 
Error 11 error LNK2005: _memmove already defined in LIBCMT.lib(memmove.obj). X\MSVCRT.lib(MSVCR110.dll) X 
Error 12 error LNK2005: _tolower already defined in LIBCMT.lib(tolower.obj). X\MSVCRT.lib(MSVCR110.dll) X 
Error 13 error LNK2005: _atoi already defined in LIBCMT.lib(atox.obj). X\MSVCRT.lib(MSVCR110.dll) X 
Error 14 error LNK2005: _isxdigit already defined in LIBCMT.lib(_ctype.obj). X\MSVCRT.lib(MSVCR110.dll) X 
Error 15 error LNK2005: _isdigit already defined in LIBCMT.lib(_ctype.obj). X\MSVCRT.lib(MSVCR110.dll) X 
Error 16 error LNK2005: _isspace already defined in LIBCMT.lib(_ctype.obj). X\MSVCRT.lib(MSVCR110.dll) X 
Error 17 error LNK2005: __strtoi64 already defined in LIBCMT.lib(strtoq.obj). X\MSVCRT.lib(MSVCR110.dll) X 
Error 18 error LNK2005: _memchr already defined in LIBCMT.lib(memchr.obj). X\MSVCRT.lib(MSVCR110.dll) X 
Error 19 error LNK2005: _fclose already defined in LIBCMT.lib(fclose.obj). X\MSVCRT.lib(MSVCR110.dll) X 
Error 20 error LNK2005: _strtol already defined in LIBCMT.lib(strtol.obj). X\MSVCRT.lib(MSVCR110.dll) X 
Error 21 error LNK2005: _sprintf already defined in LIBCMT.lib(sprintf.obj). X\MSVCRT.lib(MSVCR110.dll) X 
Error 22 error LNK2005: _fflush already defined in LIBCMT.lib(fflush.obj). X\MSVCRT.lib(MSVCR110.dll) X 
Error 23 error LNK2005: __errno already defined in LIBCMT.lib(dosmap.obj). X\MSVCRT.lib(MSVCR110.dll) X 
Error 24 error LNK2005: __lseeki64 already defined in LIBCMT.lib(lseeki64.obj). X\MSVCRT.lib(MSVCR110.dll) X 
Error 25 error LNK2005: _getenv already defined in LIBCMT.lib(getenv.obj). X\MSVCRT.lib(MSVCR110.dll) X 
Error 26 error LNK2005: _isalnum already defined in LIBCMT.lib(_ctype.obj). X\MSVCRT.lib(MSVCR110.dll) X 
Error 27 error LNK2005: _isalpha already defined in LIBCMT.lib(_ctype.obj). X\MSVCRT.lib(MSVCR110.dll) X 
Error 28 error LNK2005: "private: __thiscall type_info::type_info(class type_info const &)" ([email protected]@[email protected]@@Z) already defined in LIBCMT.lib(typinfo.obj). X\MSVCRT.lib(ti_inst.obj) X 
Error 29 error LNK2005: "private: class type_info & __thiscall type_info::operator=(class type_info const &)" ([email protected]@[email protected]@@Z) already defined in LIBCMT.lib(typinfo.obj). X\MSVCRT.lib(ti_inst.obj) X 
Error 30 error LNK2005: __strdup already defined in LIBCMT.lib(strdup.obj). X\MSVCRT.lib(MSVCR110.dll) X 
Error 31 error LNK2005: __close already defined in LIBCMT.lib(close.obj). X\MSVCRT.lib(MSVCR110.dll) X 
Error 32 error LNK2005: __fileno already defined in LIBCMT.lib(fileno.obj). X\MSVCRT.lib(MSVCR110.dll) X 
Error 33 error LNK2005: __read already defined in LIBCMT.lib(read.obj). X\MSVCRT.lib(MSVCR110.dll) X 
Error 34 error LNK2005: __strnicmp already defined in LIBCMT.lib(strnicmp.obj). X\MSVCRT.lib(MSVCR110.dll) X 
Error 35 error LNK1169: One or more multiply defined symbols found in. X\..\Release\X.exe X 

如果我curllib.lib取代curllib_static.lib以上我会得到一个错误的libcurl.dll丢失。

因为这是因为我想我的目录中没有额外的libcurl.dll我使用静态libcurl。

如何解决这个问题?

我使用这个libcurl的与Microsoft Visual Studio这样的2012年 http://curl.haxx.se/download/libcurl-7.19.3-win32-ssl-msvc.zip

+0

相关:http://stackoverflow.com/questions/3411259/using-libcurl-without-dll – 2014-09-03 12:36:21

+0

@SHR:我几秒前添加了错误。我试图在最后使用命名空间,但同样的错误。 – PatrickB 2014-09-03 12:42:10

+0

@AdrianoRepetti:没有工作。我更新了上面的app.cpp的代码。 – PatrickB 2014-09-03 12:42:47

回答

0

的问题是用Visual C++相当普遍,这是不容易的描述到底该怎么做来解决这些问题。您需要非常小心,并且真正了解您包含哪些库,并且没有足够的信息来解决这个问题。

一个常见原因是使用了错误的运行时库。在VS中,这将是/ MT和/ MD开关之间的差异,但您似乎正在使用makefile,因此可能不适用。 LIBCMT是多线程库,但它看起来好像您可能也包含另一个库。

我不建议使用#pragmas来包含链接库。把这些放在makefile中,这样你就可以在一个地方看到它。

通常它有助于运行与启用日志记录,看看到底是什么库被称为链接。

你的目录树和设置都帮助不大,但最小的完整的项目,包括一个makefile可能允许有人在这里诊断问题。

+0

有没有像这样的项目jsfiddle?或者我应该上传项目作为zip为你? – PatrickB 2014-09-03 13:50:40

+0

不,我们在谈论的是http://stackoverflow.com/help/mcve。新项目,最小的源代码重现,在这里发布所有人都可以看到和学习​​,并希望回答。为你更多的工作,为读者带来更多的价值。 – 2014-09-03 22:56:10

相关问题