2014-09-03 2 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 **

오류입니다. 내가 libcurl.dll이 누락하는 오류를 얻을 것보다

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을 사용하고 있지 않기 때문에.

어떻게 해결할 수 있습니까?

이 같은 2012 년 http://curl.haxx.se/download/libcurl-7.19.3-win32-ssl-msvc.zip

+0

관련 항목 : http://stackoverflow.com/questions/3411259/using-libcurl-without-dll –

+0

@SHR : 몇 초 전에 오류를 추가했습니다. 그리고 결국 네임 스페이스를 사용하려고했지만 같은 오류가 발생했습니다. – PatrickB

+0

@AdrianoRepetti : 작동하지 않습니다. 위의 app.cpp에 대한 코드를 업데이트했습니다. – PatrickB

답변

0

문제는 Visual C++에서 꽤 일반적인 마이크로 소프트 비주얼 스튜디오와이 libcurl에 사용하고, 그것은 오류를 수정하려면 어떻게 정확하게 설명하기 쉽지 않다. 당신은 큰주의를 기울여야하고 어떤 도서관을 포함 하는지를 정말로 이해해야하며, 그것을 해결하기위한 정보가 충분하지 않습니다.

한 가지 일반적인 원인은 잘못된 런타임 라이브러리를 사용하고 있기 때문입니다. VS에서는/MT와/MD 스위치의 차이점이 있지만 makefile을 사용하는 것 같아 적용되지 않을 수도 있습니다. LIBCMT는 다중 스레드 라이브러리이지만 다른 라이브러리도 포함 할 수있는 것처럼 보입니다.

#pragma를 사용하여 링크 라이브러리를 포함하지 않는 것이 좋습니다. makefile에 이들을 넣으면 한 곳에서 모두 볼 수 있습니다.

는 종종 그것은

디렉토리 트리와 설정이 약간의 도움이 있습니다. 라이브러리에서 호출되고 정확히 볼 수 로깅을 사용하여 링커를 실행하는 데 도움이되지만 메이크 파일을 포함하여 최소한의 완전한 프로젝트는 여기에 사람을 허용 할 수 있습니다 문제를 진단하십시오.

+0

이런 프로젝트에 jsfiddle과 같은 것이 있습니까? 또는 당신을 위해 zip으로 프로젝트를 업로드해야합니까? – PatrickB

+0

아니요. 우리가 말하는 것은 http://stackoverflow.com/help/mcve입니다. 새로운 프로젝트, 재현 할 최소한의 소스 코드, 여기에 모든 것을 게시하여 모든 사람이보고 배우고 잘하면 답변 할 수 있도록하십시오. 더 많은 일, 독자를위한 더 많은 가치. –