其實這個問題在網上能搜到大把的解決方案。大家的統一答案都是
根據輸出資訊在執行 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.它會自動檢測工程中呼叫的鏈結庫,安裝完成後會自動釋放到指定資料夾下。如果缺少部分鏈...