Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xcode/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在C+中分发动态库+;对于OSX_C++_Xcode_Opencv_Shared Libraries - Fatal编程技术网

C++ 在C+中分发动态库+;对于OSX

C++ 在C+中分发动态库+;对于OSX,c++,xcode,opencv,shared-libraries,C++,Xcode,Opencv,Shared Libraries,我已经写了一个程序,它非常依赖于OpenCV。我已经从最新的稳定版本编译了OpenCV,现在想发布这个程序,以确保人们不需要自己编译OpenCV。程序本身是使用g++编译的 我尝试了很多方法来解决这个问题: 将OpenCV编译为静态库是可行的,但我无法将我的程序静态链接到这些库,因为OSX中的一些库无法静态链接;我在这里找到了这些信息: 我尝试转移到XCode,在那里我将它用作命令行项目。我将搜索路径和安装位置设置为@rpath,并添加了一个构建阶段来将文件复制到可执行文件。我用otool验证了

我已经写了一个程序,它非常依赖于OpenCV。我已经从最新的稳定版本编译了OpenCV,现在想发布这个程序,以确保人们不需要自己编译OpenCV。程序本身是使用g++编译的

我尝试了很多方法来解决这个问题:

  • 将OpenCV编译为静态库是可行的,但我无法将我的程序静态链接到这些库,因为OSX中的一些库无法静态链接;我在这里找到了这些信息:

  • 我尝试转移到XCode,在那里我将它用作命令行项目。我将搜索路径和安装位置设置为@rpath,并添加了一个构建阶段来将文件复制到可执行文件。我用otool验证了编译后的文件是否有正确的链接,但在一台干净的机器(没有OpenCV库的机器)上仍然失败,并出现“Library not found@rpath/libopencv…”错误。(是的,所有Mac都使用Lion,因此@rpath应该可以工作)。答案就在这里:

  • 我在编译文件和库上运行onig otool-L得到的结果是
    @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
    文件,找出它们的区别。。。