2

我打算在我的项目中使用 libcurl。我已经下载了库源,将其构建并集成到一个小型 POC 应用程序中。我能够构建和运行应用程序,而生成的 libcurl.dll 和 libcurl_imp.lib 文件没有任何问题。现在,当我在我的项目中集成相同的库时,我遇到了链接器错误。

6>foo.obj : error LNK2001: unresolved external symbol __imp__curl_easy_setopt

6>foo.obj : error LNK2001: unresolved external symbol __imp__curl_easy_perform

6>foo.obj : 错误 LNK2001: 无法解析的外部符号 __imp__curl_easy_cleanup

6>foo.obj : error LNK2001: unresolved external symbol __imp__curl_global_init

6>foo.obj : 错误 LNK2001: 无法解析的外部符号 __imp__curl_easy_init

我已经研究并尝试了各种解决方法,例如添加CURL_STATICLIB定义、附加库更改为 /MT甚至将库复制到发布目录,但似乎没有任何效果。据我所知,方法#1 和#2 在我的步骤中的唯一区别是#1 是使用libcurl.dll 的控制台应用程序,而在我的主项目中,这是另一个试图链接到libcurl.dll 的dll。 . 这是否需要改变方法?我可以为两者使用相同的生成的多线程 DLL /MD 文件吗(尝试 /MT 也没有成功)?还有其他想法吗?

以下是链接器选项。

- - - - - - - - - - - - - - - - - - - - - - - - -在职的-------------------------------------------------

/OUT:"C:\SampleFTP\Release\SampleFTP.exe" /INCREMENTAL:NO /NOLOGO /LIBPATH:"C:\SampleFTP\SampleFTP\Release" /MANIFEST /MANIFESTFILE:"Release\SampleFTP.exe.intermediate.manifest" /DEBUG /PDB:"c:\SampleFTP\release\SampleFTP.pdb" /SUBSYSTEM:CONSOLE /OPT:REF /OPT:ICF /LTCG /MACHINE:X86 /ERRORREPORT:PROMPT libcurl_imp.lib kernel32.lib user32.lib gdi32。 lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib

- - - - - - - - - - - - - - - - - - - - - - - - -在职的-------------------------------------------------

----------------------------------------------不工作--- ----------------------------------------------

/OUT:".......\nt\Win32\Release/foo__tests.dll" /INCREMENTAL:NO /NOLOGO /LIBPATH:"C:\FullLibPath\libcurl_libs" /LIBPATH:"......\ nt\Win32\Release" /DLL /MANIFEST /MANIFESTFILE:".\foo__tests\Win32\Release\foo__tests.dll.intermediate.manifest" /DEBUG /PDB:".......\nt\Win32\Release/ foo_tests.pdb" /OPT:REF /OPT:ICF /LTCG /IMPLIB:".......\nt\Win32\Release/foo_tests.lib" /MACHINE:X86 /ERRORREPORT:PROMPT odbc32.lib odbccp32.lib util_process.lib wsock32.lib Version.lib libcurl_imp.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib ". .....\nt\win32\release\otherlib1.lib" "......\nt\win32\release\otherlib2.lib"

----------------------------------------------不工作--- ----------------------------------------------

4

3 回答 3

1

你运行命令了吗

curl-config --cflags
curl-config --libs

通过 --libs 的结果,我可以找到如何链接我的应用程序。

于 2010-03-12T09:57:43.230 回答
1

好的......这令人尴尬......我已经设法解决了这个问题,你可能猜到它与 libcurl 无关......基本上,链接到 libcurl 的文件是多个项目的一部分。因此,虽然我在第一个项目中正确定义了库,但在其他项目中却没有......并且构建日志一个接一个地显示项目(成功/失败消息),我只有在与我一起经历时才能注意到问题前辈……总而言之,这是一次令人谦卑的经历……

经验教训(对于未来的访问者)将是 - Libcurl 是一个成熟的产品,不太可能用于基本捆绑 - 如果您要使用 windows .dll,唯一需要做的是 1)下载源代码。打开 soln 文件。构建(作为发布 dll)。2) 包括 curl 库的附加头文件路径。3) 链接时包含 .lib 文件作为依赖项。4)开始进行 curl 调用(包括源中的 curl 标头)

你应该很高兴。对于开始(除了主页上的优秀存储库)我在这里找到了一个很好的教程......

http://www.luckyspin.org/?p=28

于 2010-03-12T10:29:13.703 回答
0

我同意 user88595。此外,我们可能需要注意以下事项(凭经验)。

这是如果您的项目中有一些共享库:

假设您有一个 Visual Studio 解决方案,其中“A”是共享库项目“B”是目标可执行项目(大多数情况下是启动项目)。因此,您需要真正了解谁在实际调用 libcurl.lib 的 API,如果它们在“A”中被调用,则需要转到项目“A”的“librarian”属性,然后添加 libcurl.lib那里的依赖。另外,添加库路径。我犯了一个错误,将依赖项添加到“链接器”属性和库路径到“B”,这导致了同样的问题。

LDAP 中的一些其他链接器错误:

一旦解决了本节中提到的链接器错误,您将收到更多关于 LDAP 的错误,要解决此问题,请在“B”的链接器依赖项下添加 wldap32.lib。

一切顺利,阿琼

于 2011-08-19T07:26:11.120 回答