C++ 在C+中分发动态库+;对于OSX
我已经写了一个程序,它非常依赖于OpenCV。我已经从最新的稳定版本编译了OpenCV,现在想发布这个程序,以确保人们不需要自己编译OpenCV。程序本身是使用g++编译的 我尝试了很多方法来解决这个问题:C++ 在C+中分发动态库+;对于OSX,c++,xcode,opencv,shared-libraries,C++,Xcode,Opencv,Shared Libraries,我已经写了一个程序,它非常依赖于OpenCV。我已经从最新的稳定版本编译了OpenCV,现在想发布这个程序,以确保人们不需要自己编译OpenCV。程序本身是使用g++编译的 我尝试了很多方法来解决这个问题: 将OpenCV编译为静态库是可行的,但我无法将我的程序静态链接到这些库,因为OSX中的一些库无法静态链接;我在这里找到了这些信息: 我尝试转移到XCode,在那里我将它用作命令行项目。我将搜索路径和安装位置设置为@rpath,并添加了一个构建阶段来将文件复制到可执行文件。我用otool验证了
@rpath/libopencv_core.2.4.dylib(兼容版本2.4.0,当前版本2.4.0)
/usr/lib/libstdc++.6.dylib(兼容版本7.0.0,当前版本52.0.0)
/usr/lib/libSystem.B.dylib(兼容版本1.0.0,当前版本159.1.0)
所以。。。我做错了什么?如何将这些库与我的程序一起分发?您应该使用Frameworks()。将应用程序使用的所有内容合并到一个文件夹中,然后链接到XCode项目中的框架。我最近不得不这样做,才能在小程序中运行JavaCV。此命令应能完成作业:
BADPATH=/opt/local/lib # in the case of MacPorts, change as necessary
for f in libopencv*2.4.dylib; do install_name_tool $f -id @rpath/$f \
-add_rpath /opt/local/lib/ -add_rpath /usr/local/lib/ -add_rpath @loader_path/. \
-change $BADPATH/libopencv_core.2.4.dylib @rpath/libopencv_core.2.4.dylib \
-change $BADPATH/libopencv_calib3d.2.4.dylib @rpath/libopencv_calib3d.2.4.dylib \
-change $BADPATH/libopencv_features2d.2.4.dylib @rpath/libopencv_features2d.2.4.dylib \
-change $BADPATH/libopencv_flann.2.4.dylib @rpath/libopencv_flann.2.4.dylib \
-change $BADPATH/libopencv_gpu.2.4.dylib @rpath/libopencv_gpu.2.4.dylib \
-change $BADPATH/libopencv_highgui.2.4.dylib @rpath/libopencv_highgui.2.4.dylib \
-change $BADPATH/libopencv_imgproc.2.4.dylib @rpath/libopencv_imgproc.2.4.dylib \
-change $BADPATH/libopencv_legacy.2.4.dylib @rpath/libopencv_legacy.2.4.dylib \
-change $BADPATH/libopencv_ml.2.4.dylib @rpath/libopencv_ml.2.4.dylib \
-change $BADPATH/libopencv_nonfree.2.4.dylib @rpath/libopencv_nonfree.2.4.dylib \
-change $BADPATH/libopencv_objdetect.2.4.dylib @rpath/libopencv_objdetect.2.4.dylib \
-change $BADPATH/libopencv_photo.2.4.dylib @rpath/libopencv_photo.2.4.dylib \
-change $BADPATH/libopencv_video.2.4.dylib @rpath/libopencv_video.2.4.dylib; done
并使用这些选项和所需的“-rpath”选项重新链接软件。这似乎不是答案。这是一个命令行实用程序,主要从命令行使用。因此,在其他平台(如*nix或Windows)上编译也非常容易。如果这是一个成熟的应用程序,我会同意你的看法,但它不是一个,只是一个简单的命令行工具。没什么好争论的。标准的“dll地狱”。这基本上就是XCode所做的。尽管如此,我还是尝试使用这些命令手动设置库链接。然而,我最终还是出现了一个“@rpath/libopencv_core.2.4.0.dylib not loaded”错误。很明显,它正在@rpath中查找它,但不知何故,它仍然无法找到这些库文件。谢谢你!链接应用程序时使用的“-rpath”是什么?奇怪。。。它在这里起作用。我也很惊讶它不起作用,但我已经在两台不同的机器上测试了它,以确保它不是其他问题。谢谢你的链接,我今天晚些时候会看的。忘了提了,但是你可以解压JAR文件,然后用
otool-L
或任何东西检查.dylibs
文件,找出它们的区别。。。