在MacOS M2上编译含OpenCV和libmagic的独立可执行程序
MacOS M2 独立可执行文件编译:已解决问题与遗留疑问
目标
在MacOS M2设备上编译生成无需额外依赖、可直接在同架构MacOS设备运行的独立可执行文件,需整合静态编译的OpenCV(含contrib模块)与libmagic。
已解决的链接错误
最初编译时遇到如下链接错误:
ld: library not found for -lopencv_viz
解决流程:
- 单独编译VTK库
- 编译OpenCV(含contrib模块)时,通过编译参数指定关联已构建的VTK,解决
opencv_viz库缺失问题 - 编译libmagic后,将其头文件与库文件迁移至项目本地目录
- 通过指定本地路径的g++命令完成编译,生成的可执行文件可正常在其他MacOS M2设备运行
当前未解决问题
设置-rpath参数后,程序未按预期通过@rpath路径查找libmagic库。
当前使用的编译命令
g++ -std=c++17 main.cpp -o myexec \ -I./thirdparty/libmagic/include \ -L./thirdparty/libmagic/lib \ -lmagic \ -I./thirdparty/opencv/include \ -L./thirdparty/opencv/lib \ -lopencv_core -lopencv_imgproc -lopencv_highgui -lopencv_imgcodecs -lopencv_viz \ -Wl,-rpath,@executable_path/thirdparty/libs
程序核心源码
#include <iostream> #include <magic.h> #include <opencv2/opencv.hpp> #include <opencv2/viz.hpp> int main() { // 初始化libmagic magic_t magic_handle = magic_open(MAGIC_NONE); if (!magic_handle) { std::cerr << "libmagic初始化失败" << std::endl; return 1; } if (magic_load(magic_handle, nullptr) != 0) { std::cerr << "加载magic数据库失败: " << magic_error(magic_handle) << std::endl; magic_close(magic_handle); return 1; } // OpenCV可视化示例 cv::Mat test_img = cv::imread("sample.jpg"); if (test_img.empty()) { std::cerr << "读取图片失败" << std::endl; magic_close(magic_handle); return 1; } cv::viz::Viz3d viz_window("3D Visualization"); viz_window.showImage(test_img); viz_window.spin(); magic_close(magic_handle); return 0; }
内容的提问来源于stack exchange,提问作者Kum0
相关产品推荐
相关产品推荐

