如何在 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
表示您的库所在的位置。
我想弄清楚如何在没有 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
表示您的库所在的位置。