mac 下的應用程式發布 及 打包

2021-06-04 05:46:39 字數 3769 閱讀 5164

其實這個問題在網上能搜到大把的解決方案。大家的統一答案都是

根據輸出資訊在執行 install_name_tool

比較複雜的是當依賴了很多第三方庫,尤其是向qt這樣的庫的時候。打包那叫乙個麻煩啊。

可是啊,macdepotqt不支援其他第三方庫,也不靈活,按照官方文件的方式手動打包,坑爹啊。

說他坑爹一點都不假,當你遇到了成片的符號需要你敲命令的話,想死的心情油然而生。

那麼好了。自己動手吧。這裡我給出乙個我寫的打包的python指令碼半成品,思想跟手動敲命令是一樣的,只不過用指令碼實現自動化了同時遞迴檢查並將缺少的庫考到bundle目錄中。指令碼中針對qt的庫進行打包了,如果希望把其他的依賴庫也打包的話在keywordlist裡邊新增相應的關鍵字就好了。希望對大家能有幫助。

import os

import sys

import commands

bundleframeworkdir = "contents/frameworks/"

bundlebinarydir = "contents/macos/"

bundlelibrarylist = ;

systemframeworkdir = "/library/frameworks/"

keywordlist = ["qt"]

#add more keywords to work better

def haskeyword(word):

for it in keywordlist:

if word.find(it) != -1:

return true

return false

return name+bundlebinarydir+binaryname

del(dependlist[0])

dependlist = [item.split(" ")[0] for item in dependlist if haskeyword(item)];

return dependlist

def copylibrary(base, src, dst):

systemfullpath = src

print "library %s depend %s" % (os.path.basename(base), os.path.basename(dst))

if not os.path.exists(dst):

bundlefullpath = os.path.dirname(dst)

os.system("mkdir -p %s" % (bundlefullpath))

os.system("cp %s %s" % (systemfullpath, bundlefullpath))

infolist = getbundledependsinfo(dst)

copydependfiles(dst, infolist)

os.system("install_name_tool -id @executable_path/../frameworks/%s %s" % (src, dst))

os.system("install_name_tool -change %s @executable_path/../frameworks/%s %s" % (src, src, base))

def getframeworkname(dirname):

if dirname.find("framework") == -1:

return

while not dirname.endswith("framework"):

dirname = os.path.dirname(dirname)

return dirname

def copyframeworkextdir(src):

syspath = systemframeworkdir + src

destpath = ""

if not os.path.exists(syspath):

return

frameworkpath = getframeworkname(syspath)

frameworkname = getframeworkname(src)

bundlepath = bundlename + "/" + bundleframeworkdir + frameworkname + "/"

for it in bundleframeworkextdir:

destpath = bundlepath + it

srcpath = frameworkpath + "/" + it

if not os.path.exists(destpath) and os.path.exists(srcpath):

print "copying %s %s" % (frameworkname, it)

os.system("cp -r %s %s" % (srcpath, destpath))

def copyframework(base, src, dst):

print "framework %s depend %s" % (os.path.basename(base), os.path.basename(dst))

systemfullpath = systemframeworkdir+src

if not os.path.exists(dst):

bundlefullpath = os.path.dirname(dst)

os.system("mkdir -p %s" % (bundlefullpath))

os.system("cp %s %s" % (systemfullpath, bundlefullpath))

copyframeworkextdir(src)

infolist = getbundledependsinfo(dst)

copydependfiles(dst, infolist)

("install_name_tool -id @executable_path/../frameworks/%s %s" % (src, dst))

os.system("install_name_tool -id @executable_path/../frameworks/%s %s" % (src, dst))

os.system("install_name_tool -change %s @executable_path/../frameworks/%s %s" % (src, src, base))

def copydependfiles(base, infolist):

targetdir = ""

for it in infolist:

targetdir = bundlename + "/" + bundleframeworkdir + it

if it.find("framework") != -1:

copyframework(base, it, targetdir)

else:

copylibrary(base, it, targetdir)

def makebundledirs():

os.system("mkdir -p " + bundlename + "/" + bundleframeworkdir)

if __name__ == "__main__":

makebundledirs()

infolist = getbundledependsinfo(target)

copydependfiles(target, infolist)

linux C 應用程式打包發布

linuxc 動態庫打包應用程式打包動態庫搜尋路徑 linux環境下打包c 應用程式,包括其依賴的動態庫,以便解決程式發布後程式執行動態庫缺失問題 動態庫編譯時新增 fpic編譯選項 一般動態庫都會有此選項,自己寫的庫記得新增 fpic 生成與位置無關 編譯自己的應用程式,得到test 打包動態庫 ...

QT 打包發布應用程式

目錄 一 用windepolyqt.exe發布exe應用程式 二 打包成單檔案exe 三 打包安裝程式 已剪輯自 qt creator release 的.exe 應用程式的執行需要依賴一些動態鏈結庫,如果在一台沒有安裝 qt的計算機上執行就需要打包動態庫拷貝過去才能執行。qt自帶有 windepl...

MFC應用程式打包發布教程

mfc應用程式打包發布 1.在同乙個解決方案下,新建乙個setup工程,工程名為vpsetup 2.右擊vpsetup工程 view 檔案系統 如下圖所示選擇專案輸出,選擇videoplayer工程作為作為主輸出 3.它會自動檢測工程中呼叫的鏈結庫,安裝完成後會自動釋放到指定資料夾下。如果缺少部分鏈...