gpt4 book ai didi

C++ 链接器不能将外部符号与静态 libcurl 一起使用

转载 作者:太空宇宙 更新时间:2023-11-04 13:46:31 26 4
gpt4 key购买 nike

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

#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 &)" (??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。

如何解决?

我将此 libcurl 与 Microsoft Visual Studio 2012 结合使用。 http://curl.haxx.se/download/libcurl-7.19.3-win32-ssl-msvc.zip

最佳答案

像这样的问题在 Visual C++ 中很常见,要准确描述如何修复这些问题并不容易。您需要格外小心并真正了解您包含了哪些库,这里没有足够的信息来解决这个问题。

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

我不建议使用#pragmas 来包含链接库。将它们放在 makefile 中,这样您就可以在一个地方看到所有内容。

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

您的目录树和设置几乎没有帮助,但包含 makefile 的最小完整项目可能允许这里的某人诊断问题。

关于C++ 链接器不能将外部符号与静态 libcurl 一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25644407/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com