MSYS2でコンパイルして、exeファイルは、出来たが、配布する時にDLLファイルの配布が面倒くさいので、MSYS2に付属している Pythonを使って、配布用フォルダーにDLL類を自動でコピーします。
#使い方
(1) main関数の__exePath__と__releasePath__を設定します。
(2) __Qt5__用に__setDeployQt関数__を作ったが、必要のない方は、main関数で、コメントアウトしてください。
(3) 後は、実行するだけで__MSYS2傘下__のDLLをリリース用のフォルダーにコピーします。
(4) このリリース用フォルダーを丸ごと圧縮して、配布すれば、解凍先で動くと思います。
#解説
MSYS2に付属の__LDDコマンド__を利用して、exeファイルからのリンクされたDLLを検索しています。
(1) MSYS2のフォルダーを変更している方は、getLdd関数の__msysPath__を変更してください。
(2) getLdd関数内では、__"/c/windows/"__フォルダー傘下のDLLをリストから外しています。
pyRelease.py
# This Python file uses the following encoding: utf-8
import sys
import subprocess
import os
import shutil
def setDeployQt(exePath, releasePath):
Deploy = "WinDeployQt.exe"
#Deploy = "MacDeployQt.exe"
result = subprocess.run([Deploy, "--libdir", releasePath, "--plugindir", releasePath, exePath], encoding="utf-8", stdout=subprocess.PIPE)
print(result.stdout)
def getLdd(exePath):
result = subprocess.run(["ldd", exePath], encoding="utf-8", stdout=subprocess.PIPE)
resultList = result.stdout.split()
msysPath = "c:/msys64"
lddList = []
for item in resultList:
if ("/" in item):
lowItem = item.lower()
if ("/c/windows/" in lowItem) == False:
fullPath = msysPath + lowItem
if os.path.isfile(fullPath):
lddList.append(fullPath)
return lddList
def uniList(ListA, ListB):
ListC = []
ListC = ListA
for itemB in ListB:
notFind = True
for itemA in ListA:
if itemB == itemA:
notFind = False
break
if notFind:
ListC.append(itemB)
return ListC
def copyFileList(releasePath, lddList):
for item in lddList:
print("copy: ", item)
shutil.copy2(item, releasePath)
def main():
#setting
exePath = "C:/work/hello/hello.exe"
releasePath = "C:/work/hello/release"
#create Folder
if os.path.isdir(releasePath) == False:
os.mkdir(releasePath)
#copy exeFile
shutil.copy2(exePath, releasePath)
#Qt tool xxxDeployQt.exe
setDeployQt(exePath, releasePath)
#ldd command
resultList = getLdd(exePath)
#list deduplication
lddList = []
lddList = uniList([], resultList)
#copy libFile
copyFileList(releasePath, lddList)
if __name__ == "__main__":
main()
環境設定により、完全な動作保証は、出来ていません。