[英]How to link curl to a program so I can run it on another machine?
我正在尝试将 curl 链接到 CodeBlocks 中的一个程序,然后在另一台 PC 上使用 Windows 运行它。如果我设置环境变量 %PATH% 一切正常,但是如果我删除它,则会出现一条错误libcurl-x64.dll not found
.
为了解决这个问题,我尝试了以下操作:
libcurl.dll.a
和libcurl.a
与 Bulid Bulid Options
和Compiler
中的Linker settings
链接,包括 x64 和 x86 版本,..\curl-7.86.0_2-win/*(32/64)*/-mingw\include
到Bulid Options
和Compiler
中的Search directories
-lcurl
、 -static-lcurl
、 -DCURL_STATICLIB -lcurl
、 -lws2_32
和-lwinmm
。 但是仍然出现相同的错误。 我该如何解决?
CB项目文件:
<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
<CodeBlocks_project_file>
<FileVersion major="1" minor="6" />
<Project>
<Option title="download" />
<Option pch_mode="2" />
<Option compiler="gcc" />
<Build>
<Target title="Debug">
<Option output="bin/Debug/download" prefix_auto="1" extension_auto="1" />
<Option object_output="obj/Debug/" />
<Option type="1" />
<Option compiler="gcc" />
<Compiler>
<Add option="-g" />
<Add directory="C:/libs/curl-7.86.0_2-win32-mingw/include" />
<Add directory="C:/libs/curl-7.86.0_2-win64-mingw/include" />
</Compiler>
<Linker>
<Add library="C:/libs/curl-7.86.0_2-win32-mingw/lib/libcurl.dll.a" />
<Add library="C:/libs/curl-7.86.0_2-win64-mingw/lib/libcurl.dll.a" />
<Add directory="C:/libs/curl-7.86.0_2-win32-mingw/lib" />
<Add directory="C:/libs/curl-7.86.0_2-win64-mingw/lib" />
</Linker>
</Target>
<Target title="Release">
<Option output="bin/Release/download" prefix_auto="1" extension_auto="1" />
<Option object_output="obj/Release/" />
<Option type="1" />
<Option compiler="gcc" />
<Compiler>
<Add option="-O2" />
</Compiler>
<Linker>
<Add option="-s" />
</Linker>
</Target>
</Build>
<Compiler>
<Add option="-Wall" />
<Add option="-fexceptions" />
<Add directory="C:/libs/curl-7.86.0_2-win32-mingw/include" />
<Add directory="C:/libs/curl-7.86.0_2-win64-mingw/include" />
</Compiler>
<Linker>
<Add option="-lcurl -lwinmm -static" />
<Add library="C:/libs/curl-7.86.0_2-win64-mingw/lib/libcurl.a" />
<Add library="C:/libs/curl-7.86.0_2-win32-mingw/lib/libcurl.a" />
<Add library="C:/libs/curl-7.86.0_2-win32-mingw/lib/libcurl.dll.a" />
<Add library="C:/libs/curl-7.86.0_2-win64-mingw/lib/libcurl.dll.a" />
<Add directory="C:/libs/curl-7.86.0_2-win32-mingw/lib" />
<Add directory="C:/libs/curl-7.86.0_2-win64-mingw/lib" />
</Linker>
<Unit filename="main.cpp" />
<Extensions>
<lib_finder disable_auto="1" />
</Extensions>
</Project>
</CodeBlocks_project_file>
有些人将此称为“DLL 地狱”,因为如果您是新手可能很难弄清楚。
但是有多种解决方案:
您可以使用 linker 标志-static
构建一个 static 可执行文件。 然而,这也需要链接你的依赖项的所有依赖项,等等......
这可能很难做到,因为 MinGW 也要求-l
的顺序正确。
此外,您可能仍然依赖于标准库,因此您可能还需要添加-static-libgcc
(对于 C)或-static-libstdc++
(对于 C++)。
如果您使用pkg-config
获得依赖项 linker 标志,则可以使用pkg-config --static --libs
列出 static 依赖项。
请注意,如果用反引号括起来,您实际上可以在 Code::Blocks linker 标志中使用pkg-config
。
static 版本的优点是您只需要分发.exe
文件。
如果您执行共享构建(默认情况下是这种情况,但有一个 -shared -shared
标志)您的.exe
文件将依赖于程序依赖项的.dll
文件,而这些.dll
文件将依赖于它们的依赖项的.dll
文件等...
但是,如果您将所有.dll
文件复制到与.exe
文件相同的文件夹中,您就可以分发您的应用程序,它将在其他系统上运行。
由于.dll
文件与.exe
文件位于同一文件夹中,因此 Windows 将在那里提取它们,无需使用PATH
环境变量指向它们的位置。
复制所有正确的.dll
文件可能是一个挑战,因此我编写了一个工具来检测.dll
文件.exe
文件依赖于哪些文件并复制这些文件。 该工具可在此处获得: https://github.com/brechtsanders/pedeps
要复制包含所有.dll
文件的.exe
文件,您需要使用-r
标志运行copypedeps
(以递归每个依赖项)。
例如,你在当前文件夹中有一个文件hello.exe
,你想将它连同它的所有依赖项一起复制到文件夹dist
中,运行以下命令:
copypedeps -r hello.exe dist
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.