如何运行与 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 链接的程序?的主要内容,如果未能解决你的问题,请参考以下文章