如何运行与 MSYS 中的 DLL 链接的程序?

Posted

技术标签:

【中文标题】如何运行与 MSYS 中的 DLL 链接的程序?【英文标题】:How do I run a program linked against a DLL in MSYS? 【发布时间】:2012-05-02 03:02:03 【问题描述】:

我已经成功地在带有 MSYS shell 环境的 windows 上使用 opencv 构建了一个演示应用程序。

我没有使用预构建的opencv安装程序,我在本地下载并编译了源代码(这是推荐的方法)。

构建opencv并运行make install后,所有文件都愉快地在:

/e/deps/libopencv/build/install/

我可以使用 cmake 指令成功地构建一个示例应用程序:

find_package(OPENCV REQUIRED)
link_directory($OpenCV_LIB_DIR)
include_directories($OpenCV_INCLUDE_DIRS)
target_link_libraries(target $OpenCV_LIBS)

在这里要完全清楚:构建二进制文件是成功的

现在,当我从 shell 运行它时,我会收到消息:

The program can't start because libopencv_core231.dll is missing from your computer. 
Try reinstalling the program to fix this problem.

所以...我知道图书馆在哪里:

$ ls /e/deps/libopencv/build/install/lib/
libopencv_calib3d231.dll.a  libopencv_features2d231.dll.a  libopencv_highgui231.dll.a     libopencv_ml231.dll.a         libopencv_video231.dll.a
libopencv_contrib231.dll.a  libopencv_flann231.dll.a       libopencv_imgproc231.dll.a  libopencv_objdetect231.dll.a
libopencv_core231.dll.a     libopencv_gpu231.dll.a         libopencv_legacy231.dll.a   libopencv_ts231.a

现在呢?

我想我可以尝试让 cmake 构建一个静态二进制文件,但这似乎非常极端。

我怎样才能使 1) windows 或 2) MSYS 环境满意。 Windows 上的类似 LD_LIBRARY_PATH 的东西?

或者这不是问题,我实际上(尽管看起来)以某种方式弄乱了二进制文件的编译方式?

编辑:

注意。无论出于何种原因,我的库似乎都是 .dll.a 文件,而不是 .dlls(请参阅 ls 结果),如果这与远程相关的话。

【问题讨论】:

【参考方案1】:

windows 搜索与 exe 相同的目录,%PATH% (Windows) 或 $PATH (msys) 目录中的任何目录,以及 windows 文件夹中的一些特殊目录 您可以将/e/deps/libopencv/build/install/lib 添加到您的$PATH。我不确定这是否适用于 msys,您可能需要在 windows 中将 E:\deps\libopencv\build\install\lib 添加到 %PATH%

如果您将程序提供给其他人,典型的解决方案是在与 EXE 相同的目录中包含 DLL 的副本。您可以通过使用命令对其进行符号链接来获得相同的效果

ln -s /e/deps/libopencv/build/install/lib/libopencv_core231.dll libopencv_core231.dll

/e/deps/libopencv/build/install/ 目录中

【讨论】:

嗯,这些似乎都没有帮助。将 dll.a 文件移动到同一目录并将它们重命名为 .dll 会导致“libopencv_core231.dll 不是为在 Windows 上运行而设计的,或者它包含错误。请尝试再次安装该程序...” 不知道 wtf 是否支持 .dll.a 文件,但是搞乱了静态链接选项,我终于设法构建了正常的 .DLL 文件,正如你上面所说的那样完美链接。

以上是关于如何运行与 MSYS 中的 DLL 链接的程序?的主要内容,如果未能解决你的问题,请参考以下文章

使用 MinGW 和 MSYS 找不到 .dll

C#中如何调用动态链接库DLL

如何在运行时解析 dll 中的外部符号,而不是使用 Cygwin 进行链接时

libgcc_s_dw2-1.dll 缺失问题解决

如何打开电脑中的DLL文件 ?

MSYS2 静态链接输出二进制