使用libcurl与Visual C ++ 2005链接问题:“未解析的外部符号__imp__curl_easy_setopt”

时间:2010-03-09 07:58:51

标签: visual-c++ curl libcurl

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

6> foo.obj:错误LNK2001:未解析的外部符号__imp__curl_easy_setopt

6> foo.obj:错误LNK2001:未解析的外部符号__imp__curl_easy_perform

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

6> foo.obj:错误LNK2001:未解析的外部符号__imp__curl_global_init

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

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

以下是链接器选项。

----------------------------------------------- - 工作----------------------------------------------- -

/ OUT:“C:\ SampleFTP \ Release \ SampleFTP.exe”/ INCREMENTAL:NO / NOLOGO / LIBPATH: “C:\ SampleFTP \ SampleFTP \发布” / MANIFEST /MANIFESTFILE:"Release\SampleFTP.exe.intermediate.manifest“ / DEBUG /PDB:"c:\SampleFTP\release\SampleFTP.pdb“ /子系统: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

----------------------------------------------- - 工作----------------------------------------------- -

---------------------------------------------- NotWorking ------------------------------------------------- < / p>

/ 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 \发布\ otherlib1.lib” “...... \ nt \ win32 \ release \ otherlib2.lib”

---------------------------------------------- NotWorking ------------------------------------------------- < / p>

3 个答案:

答案 0 :(得分:1)

你是否运行了命令

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

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

答案 1 :(得分:1)

好吧......这个令人讨厌....我设法解决了这个问题,你可能会猜测它与libcurl无关。基本上,链接到libcurl的文件是多个项目的一部分。因此,虽然我已经在第一个项目中正确定义了库,但我没有在其他项目中。并且构建日志一个接一个地显示项目(成功/失败消息),我只能在通过togeather with my时注意到问题高级...总而言之,这是一种令人羞愧的经历..

吸取的教训(对于未来的访问者来说)将是 - Libcurl是一种成熟产品,不太可能因基本捆绑而受到影响 - 只有你打算使用windows .dll才有必要 1)下载源代码。打开soln文件。构建(作为发布dll)。 2)为curl库包含额外的头路径。 3)链接时包含.lib文件作为依赖项。 4)开始进行卷曲调用(包括源代码中的卷曲标题)

你应该好好去。为了开始(除了主页上的优秀存储库),我在这里提供了一个很好的教程...

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

答案 2 :(得分:0)

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

如果你的项目中有一些共享库,那就是这样的:

假设您有一个Visual Studio解决方案 &#34; A&#34;是一个共享的库项目 &#34; B&#34;是目标可执行项目(大多数情况下是启动项目)。     所以,你需要真正看到谁在实际调用libcurl.lib的API, 它们被称为&#34; A&#34;,你需要去图书管理员&#34;该项目的财产&#34; A&#34;然后在那里添加libcurl.lib依赖项。另外,添加lib路径。 我错误地将依赖项添加到&#34;链接器&#34;属性和&#34; B&#34;的lib路径,导致了同样的问题。

一些额外的链接器错误w.r.t LDAP:

一旦解决了本节中提到的链接器错误,您将获得有关LDAP的更多错误,以解决此问题,在&#34; B&#34;的链接器依赖性下添加wldap32.lib。

一切顺利, 阿琼