调用静态 opencv 库
Invoking static opencv library
我基于这篇文章构建了一个静态 opencv 库,之后我想为我的应用程序调用静态 opencv 库。但是,应用程序似乎无法链接静态opencv库,并且它给了我以下警告:
ld: warning: ignoring file /usr/local/lib/libopencv_core.a, file was built for archive which is not the architecture being linked (i386): /usr/local/lib/libopencv_core.a
ld: warning: ignoring file /usr/local/lib/libopencv_highgui.a, file was built for archive which is not the architecture being linked (i386): /usr/local/lib/libopencv_highgui.a
ld: warning: ignoring file /usr/local/lib/libopencv_imgproc.a, file was built for archive which is not the architecture being linked (i386): /usr/local/lib/libopencv_imgproc.a
ld: warning: ignoring file /usr/local/lib/liblibjasper.a, file was built for archive which is not the architecture being linked (i386): /usr/local/lib/liblibjasper.a
ld: warning: ignoring file /usr/local/lib/liblibjpeg.a, file was built for archive which is not the architecture being linked (i386): /usr/local/lib/liblibjpeg.a
ld: warning: ignoring file /usr/local/lib/liblibpng.a, file was built for archive which is not the architecture being linked (i386): /usr/local/lib/liblibpng.a
ld: warning: ignoring file /usr/local/lib/liblibtiff.a, file was built for archive which is not the architecture being linked (i386): /usr/local/lib/liblibtiff.a
ld: warning: ignoring file /usr/local/lib/libzlib.a, file was built for archive which is not the architecture being linked (i386): /usr/local/lib/libzlib.a
ld: warning: ignoring file /usr/local/lib/libIlmImf.a, file was built for archive which is not the architecture being linked (i386): /usr/local/lib/libIlmImf.a
在我看来,应用程序正在尝试调用动态 opencv 库,而仅调用cv::Mat
测试的简单应用程序会给我以下错误:
Undefined symbols for architecture i386:
"cv::Mat::deallocate()", referenced from:
cv::Mat::release() in main.o
"cv::fastFree(void*)", referenced from:
cv::Mat::~Mat() in main.o
编辑:正如答案所表明的那样,这不是链接问题,而是链接为不同架构构建的库的问题。除此之外,在构建和使用静态 OpenCV 库时,您应该注意的另外两件重要事情是:
确保它仅构建活动架构(是)。
此外,您应该链接opencv_highgui.a使用的
framework Cocoa;general;-framework QTKit;general;-framework QuartzCore;general;-framework AppKit;
。
这不是关于不成功的链接,而是关于不成功的构建。"文件是为存档而构建的,而不是正在链接的体系结构 (i386)"。您需要正确构建它,也就是说,为正确的体系结构构建它。
不向命令行传递任何选项cmake
它确实为机器的本机架构构建了库(这是默认选项),大概是x86_64。但是,出于某种原因,您正在尝试在此处构建一个 32 位 i386 应用程序。因此,您的体系结构没有正确的静态库。
你可以通过构建 32 位 -Darch=i386
OpenCV 来解决它 cmake
),或者通过构建 64 位应用程序(原生架构或 x86_64,具体取决于您的构建系统)。
如果你觉得勇敢,你也可以构建 32 位和 64 位静态库,将它们组装成一个通用二进制文件,并链接到该通用库。
您应该使用以下方法构建本地应用程序:
cmake .. -DOpenCV_DIR=/path/to/opencv-3.0.0-beta/build/ -DCMAKE_OSX_ARCHITECTURES=x86_64
即。强制x86_64本地构建,这就是opencv版本。
- 如何在 docker 中使用静态 opencv 库编译 c++ 应用程序
- 将本地 OpenCV Mat 变量声明为静态以防止重新分配
- 如何使用cmake设置OpenCV以启用动态和静态构建
- OpenCV噪声消除静态摄像机的视频
- 尽管有静态链接,Opencv 3.2.0 .dll丢失
- Android Studio 2.2链接OPENCV静态库
- 在Windows上运行的Eclipse上静态链接OpenCV
- openCV 243 使用静态库错误LNK2019
- 静态 opencv 在 Arm Linux busybox 上找不到 USB 网络摄像头
- 使用 TDM-GCC-64、Cmake 和 CodeBlock 在 Windows 8 中构建 OpenCV 静态库时出
- Ubuntu上的OpenCv静态编译
- 将 opencv 捆绑为静态库会提供数千个未定义的引用
- 使用多线程调试 DLL (/MDd) C 运行时库生成静态 Opencv 库
- 调用静态 opencv 库
- 如何将 OpenCV 2.4 静态库与 Visual Studio 配合使用
- Android Studio链接OpenCV静态库
- Opencv静态链接给出错误
- 减少与opencv静态链接的可执行文件的大小
- 在Eclipse Windows中链接OpenCV静态库
- ARM的Opencv静态库链接错误