首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >C++链接器不能使用带有静态libcurl的外部符号

C++链接器不能使用带有静态libcurl的外部符号
EN

Stack Overflow用户
提问于 2014-09-03 12:31:44
回答 2查看 2.4K关注 0票数 1

我有一个简单的C++代码。

代码语言:javascript
运行
复制
#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;
}

我的目录树。

代码语言:javascript
运行
复制
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

这是我的设定。

代码语言:javascript
运行
复制
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**

错误.

代码语言:javascript
运行
复制
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 &)" (??0type_info@@AAE@ABV0@@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 &)" (??4type_info@@AAEAAV0@ABV0@@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_static.lib替换curllib.lib,我就会得到一个libcurl.dll丢失的错误。

因为这一点,而且由于我不想在我的目录中添加额外的libcurl.dll,所以我使用的是静态libcurl。

如何修复?

我在2012中使用这个libcurl。http://curl.haxx.se/download/libcurl-7.19.3-win32-ssl-msvc.zip

EN

回答 2

Stack Overflow用户

发布于 2014-09-03 13:38:32

这样的问题在VisualC++中很常见,很难准确描述如何修复它们。您需要非常小心,并真正了解您包括哪些库,而且这里没有足够的信息来解决它。

一个常见的原因是使用错误的运行库。在VS中,这将是/MT和/MD交换机之间的区别,但是您似乎在使用makefile,所以这可能不适用。LIBCMT是多线程库,但它看起来也可能包含另一个库。

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

通常,它有助于在启用日志记录的情况下运行链接器,以准确查看调用了哪些库。

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

票数 0
EN

Stack Overflow用户

发布于 2014-09-03 14:00:36

在堆栈溢出中有一个老问题,它会产生一个非常相似的问题,请看这里:

错误LNK2005: xxx已经在MSVCRT.lib(MSVCR100.dll) C:\something\LIBCMT.lib(setlocal.obj)中定义

这里还有另一个链接:

带有LNK2005和MSVCRTD.lib的LIBCMTD.lib错误

我希望它能帮到你!

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25644407

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档