首页 > 编程知识 正文

mac应用程序无法打开,mac安装包后缀

时间:2023-05-04 23:06:41 阅读:38924 作者:2281

国内常见的操作系统为windows,但mac系统在高端市场也占了部分比例。 要开发MAC APP应用程序,必须了解MACOS搜索动态库的顺序。

1 .搜索顺序运行时动态库搜索路径的优先级如下:

a .编译目标代码时指定的动态库搜索路径

b .由环境变量LD_LIBRARY_PATH指定的动态库搜索路径;

在c .配置文件/etc/ld.so.conf中指定的动态库搜索路径;

d .默认动态库搜索路径/lib和/usr/lib;

/lib和/usr/lib只能通过root权限进行更改,配置文件/etc/ld.so.conf也需要root权限。

2 .与APP一起发布在xcode下编译的程序,并在开发机器上运行是没有问题的。 但是,如果用于其他用户,则有可能出现问题。 因为用户不一定有这个库。 解决这个问题有两种方法:一是给其他用户也安装依赖的库文件;二是将所有的dylib随行发布,消除依赖。不考虑第一个方案。 大多数情况下,这样做是不现实的; 接下来,对dylib的分发方法进行说明。 如果只是简单地将依赖的dylib文件复制到可执行文件目录中并一起传输,则无法消除依赖关系;运行时仍然报告错误; 编译动态库时,必须指定INSTALL_PATH.(即其安装路径)。如果编译完成后,可执行文件正在使用动态库,则在编译可执行文件时,可以指定动态库因此,必须首先将所有要使用的dylib文件复制到可执行文件目录中,然后更改动态库的INSTALL_PATH; 更改为可执行文件所在的目录; 请注意,如果依赖于多个动态库,则需要更改使用的所有动态库的从属动态库路径,因为使用的动态库已经依赖于其他动态库。

以OpenCV为例,运行假设最终编译的可执行文件为macimgproc的命令: otool -L macimgproc显示以下输出:

macimgproc :/usr/local/opt/opencv/lib/lib opencv _ calib 3d.2.4.dylib (兼容性版本2.4.0, current2.4. 12版(/usr/local/opt/opencv/lib/lib opencv _ contrib.2.4.dylib (兼容性2.4版) libopencv_core.2.4.dylib )兼容性版本2.4.4当前版本2.4.12 (/usr/local/opt/opencv/lib/libopencv_features2d.2.4.dylib )兼容性版本2当前版本2.4.12 (/usr/local/opt/opencv/lib/lib opencv _ flann.2.4.dylib (兼容性版本2.4.4当前版本2.4.12 (/usr/local/opt/opencv/lib lib opencv _ GPU.2.4.dylib (兼容性版本2.4.0当前版本2.4.12 (/usr/local/opt/opencv/lib/lib opencv _ highgui.2.4.dylib (兼容性版本2.4当前版本2.4.12 (/usr/local/opt/opencv/lib/lib opencv _ img proc.2.4.dylib (兼容性版本2.4当前版本2.4.12 (/usr/local/opt/opencv/lib/libopencv_legacy.2.4.dylib )兼容性版本2.4当前版本2.4.12 (/usr/local/opt/opencv/lib/lib opencv _ ml.2.4.dylib (兼容性版本2.4.0当前版本2.4.12 (/usr/local/opt/opencv/lib/lib opencv _ nonfree.2.4.dylib (兼容性版本2.4当前版本2.4.12 (/usr/local/opt/opencv/lib/lilib ) current版本2.4.12 (/usr/local/opt/opencv/lib/lib opencv _ OCL.2.4 .兼容性版本)

ion 2.4.0, current version 2.4.12) /usr/local/opt/opencv/lib/libopencv_photo.2.4.dylib (compatibility version 2.4.0, current version 2.4.12) /usr/local/opt/opencv/lib/libopencv_stitching.2.4.dylib (compatibility version 2.4.0, current version 2.4.12) /usr/local/opt/opencv/lib/libopencv_superres.2.4.dylib (compatibility version 2.4.0, current version 2.4.12) /usr/local/opt/opencv/lib/libopencv_video.2.4.dylib (compatibility version 2.4.0, current version 2.4.12) /usr/local/opt/opencv/lib/libopencv_videostab.2.4.dylib (compatibility version 2.4.0, current version 2.4.12) /usr/lib/libc++.1.dylib (compatibility version 1.0.0, current version 307.4.0) /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1238.0.0)

  说明macimgproc依赖所有的OpenCV动态库文件;因此首先需要将所有动态库文件拷贝到macimgproc所在目录,然后需要将macimgproc文件中的所有/usr/local/opt/opencv/lib/libopencv_xxx修改为@executable_path/libopencv_xxx;@executable_path表示可执行文件所在目录;指示所有OpenCV动态库从可执行文件所在目录查找;更多@executable_path的介绍以及其他变量参见文章 @rpath, @loader_path, @executable_path。使用命令install_name_tool -change {old.dylib} {new.dylib} {filename}修改动态库的INSTALL_PATH,例如:

install_name_tool -change /usr/local/Cellar/opencv/2.4.12/lib/libopencv_flann.2.4.dylib @executable_path/libopencv_flann.2.4.dylib macimgproc

  执行后重新otool -L macimgproc可看到如下的输出:

macimgproc: ... /usr/local/opt/opencv/lib/libopencv_features2d.2.4.dylib (compatibility version 2.4.0, current version 2.4.12) @executable_path/libopencv_flann.2.4.dylib (compatibility version 2.4.0, current version 2.4.12) /usr/local/opt/opencv/lib/libopencv_gpu.2.4.dylib (compatibility version 2.4.0, current version 2.4.12) ...

  整个OpenCV库大概有19个dylib文件,因此写了一个简单的批量修改脚本

#!/usr/dqdxx/rubyPreview=0def fix_opencv_lib_link(file,rlib) if(rlib.include?('libopencv')) name = rlib.split('/').last cmd = "install_name_tool -change #{rlib} @executable_path/#{name} #{file}" if Preview == 1 puts "Preivew: #{cmd}" else `#{cmd}` end else puts "ignore rlib: #{rlib}"; endenddef fix_file_rely_lib(file) puts "===============start change #{file}===============" linklibs = `otool -L #{file}`.split("n") linklibs.delete_at(0) linklibs.each_with_index do |rlib,i| rlib = rlib.split()[0] fix_opencv_lib_link(file,rlib) endenddef doopencvlist # puts "Preview: #{Preview}" `ls |grep libopencv`.split().each_with_index do |file,i| fix_file_rely_lib(file) endenddef viewlib(file) puts `otool -L #{file}`endif __FILE__ == $0 if ARGV[0] == 'preview' Preview = 1; doopencvlist(); elsif ARGV[0] == 'view' `ls |grep libopencv`.split().each_with_index do |file,i| # puts "===============start view #{file}===============" viewlib(file) end elsif ARGV[0] == 'do' doopencvlist(); elsif ARGV[0] == 'previewfile' Preview = 1; fix_file_rely_lib(ARGV[1]) elsif ARGV[0] == 'file' fix_file_rely_lib(ARGV[1]) else puts "please input command [preview,do,previewfile,file,view] " endend

  合理的脚本代码可以有效的提高工作效率,减少重复劳动。

  欢迎光临知了软件开发网络平台,本公司定制开发各类软件,主要方向为桌面专业软件开发和插件定制开发,桌面软件主要包括文字图形识别类软件,信息管理类软件,3D打印类软件,视频类软件以及其它涉及专业的各类图形图像处理软件。插件包含AE插件,AI插件,PS插件,PDF插件,3DMAX插件以及Word,Excel等Office插件开发。详情请咨询,微信QQ:312117271,手机:18928899728,邮箱: anjingzhi_sea@163.com.
公司网址:http://www.zhiliaos.com

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。