【问题标题】:How can I link executable with dylib in Mac OS X command line?如何在 Mac OS X 命令行中将可执行文件与 dylib 链接?
【发布时间】:2018-04-22 00:10:53
【问题描述】:

我试图弄清楚如何在没有和 ide 的情况下在命令行上编译东西。这是我第一次使用命令行构建项目。而且,我在链接一个简单项目上的依赖项时遇到了麻烦。

我有这个树结构:

.
├── 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

这些天我一直在搞砸,我似乎无法弄清楚。当可执行文件需要这些定义时,它如何找到要链接的东西?

【问题讨论】:

    标签: c++ macos linker-errors clang++ dylib


    【解决方案1】:

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

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

    你可能需要这个:

    export DYLD_LIBRARY_PATH=./lib:$DYLD_LIBRARY_PATH
    

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

    【讨论】:

      猜你喜欢
      • 2016-03-03
      • 2015-03-21
      • 2015-11-26
      • 2016-12-27
      • 2013-12-02
      • 2013-09-06
      • 2015-11-17
      • 1970-01-01
      • 2018-08-15
      相关资源
      最近更新 更多