如何在 Mac OS X 命令行中使用 dylib link 可执行文件?

How can I link executable with dylib in Mac OS X command line?

我想弄清楚如何在没有 a 和 ide 的情况下在命令行上编译东西。这是我第一次使用命令行构建项目。而且,我在 linking 对一个简单项目的依赖性上被踩踏了。

我有这个树结构:

.
├── include
...
...
├── lib
│   ├── libopencv_calib3d.3.3.1.dylib
│   ├── libopencv_core.3.3.1.dylib
│   ├── libopencv_cudev.3.3.1.dylib
│   ├── libopencv_features2d.3.3.1.dylib
│   ├── libopencv_flann.3.3.1.dylib
│   ├── libopencv_highgui.3.3.1.dylib
│   ├── libopencv_imgcodecs.3.3.1.dylib
│   ├── libopencv_imgproc.3.3.1.dylib
│   ├── libopencv_videoio.3.3.1.dylib
│   ├── libopencv_ximgproc.3.3.1\ 2.dylib
│   └── libopencv_ximgproc.3.3.1.dylib
├── resources
│   ├── giraffe.jpg
│   ├── golden-retriver-puppy.jpg
│   ├── kangaroo.jpg
│   └── kitty.jpeg
└── sources
    └── main.cpp

我的主要代码是这样的:

#include "opencv2/ximgproc/segmentation.hpp"
#include "opencv2/highgui.hpp"
#include "opencv2/core.hpp"
#include "opencv2/imgproc.hpp"
#include <iostream>
#include <ctime>

static void help() {
    std::cout << std::endl <<
    "Usage:" << std::endl <<
    "./ssearch input_image (f|q)" << std::endl <<
    "f=fast, q=quality" << std::endl <<
    "Use l to display less rects, m to display more rects, q to quit" << std::endl;
}


int main(int argc, char** argv) {
    std::cout << "Test" << std::endl;
    // If image path and f/q is not passed as command
    // line arguments, quit and display help message
    if (argc < 3) {
        help();
        return -1;
    }

    return 0;
}

在我的 mac 终端中,我使用以下命令构建它:

clang++ sources/main.cpp -o a -I./include -L./lib -lopencv_core.3.3.1 -lopencv_ximgproc.3.3.1 -lopencv_highgui.3.3.1 -lopencv_imgproc.3.3.1 -lopencv_imgcodecs.3.3.1

它没有给我任何错误。

但是当我运行~$ ./a

我收到以下错误:

dyld: Library not loaded: @rpath/libopencv_core.3.3.dylib
  Referenced from: 
  /Users/lgdelacruz/Documents/GSoC/project/objectdetection/./a
  Reason: image not found
Abort trap: 6

我已经弄乱这些好几天了,我似乎无法弄清楚。当需要这些定义时,可执行文件如何找到 link 的内容?

您正在动态链接库来编译您的代码,这需要告诉系统在哪里可以找到编译时运行的库时间.

现在,您只是告诉编译器从-L 指定的路径中的库进行编译,而不是告诉系统在执行时在哪里找到库。

你可能需要这个:

export DYLD_LIBRARY_PATH=./lib:$DYLD_LIBRARY_PATH

其中 ./lib 表示您的库所在的位置。