openfilpper 软件编译问题记录
openfilipper在windows下面从源码安装的介绍的官方内容见:https://www.graphics.rwth-aachen.de/media/openflipper_static/Daily-Builds/Doc/Free/Developer/buildingOpenFlipper.html
但是在具体执行过程中,qt相关的moc,和uic文件并没有自动生成,因此,此处记录如何利用python执行moc,uic,生成相关的文件,具体代码如下:
import os
uiprefix = "ui_";
mocprefix = "moc_";
ui_original_suffix = ".ui"
ui_result_suffix = ".h"
moc_original_suffix = ".hh"
moc_result_suffix = ".cc"
moc_content = "Q_OBJECT"
ui_exe = "E:\Qt\Qt5.13.2\5.13.2\msvc2017_64\bin\uic.exe"
moc_exe = "E:\Qt\Qt5.13.2\5.13.2\msvc2017_64\bin\moc.exe"
def getAllFilesWithSuffix(path, suffix):
resultFiles = []
for root, dirs, files in os.walk(path):
for file in files:
if file.endswith(suffix):
resultFiles.append(os.path.join(root, file))
return resultFiles
def getAllFilesWithPrefix(path, prefix):
resultFiles = []
for root, dirs, files in os.walk(path):
for file in files:
if file.startswith(prefix):
resultFiles.append(os.path.join(root, file))
return resultFiles
def getAllFilesWithSuffixAndContain(path, suffix, containString):
matchSuffixFiles = getAllFilesWithSuffix(path, suffix)
matchFiles = []
for file in matchSuffixFiles:
with open(file, encoding="utf8", mode='r') as fid:
content = fid.read()
if (containString in content):
matchFiles.append(file)
return matchFiles
def removeUIResultFiles(path):
uiresult_files = getAllFilesWithPrefix(".\", uiprefix)
for file in uiresult_files:
os.remove(file)
def removeMOCResultFiles(path):
mocresult_files = getAllFilesWithPrefix(".\", mocprefix)
for file in mocresult_files:
os.remove(file)
def removeUIAndMOCResultFiles(path):
removeUIResultFiles(path)
removeMOCResultFiles(path)
def convertUIFilename(uifile):
dirname = os.path.dirname(uifile)
basename = os.path.basename(uifile)
basename = uiprefix + basename
basename = basename.replace(ui_original_suffix, ui_result_suffix)
return os.path.join(dirname,basename)
def convertMOCFilename(mocfile):
dirname = os.path.dirname(mocfile)
basename = os.path.basename(mocfile)
basename = mocprefix + basename
basename = basename.replace(moc_original_suffix, moc_result_suffix)
return os.path.join(dirname,basename)
def generateUICResult(path):
uifiles = getAllFilesWithSuffix(path, ui_original_suffix)
with open("generateUIC.bat", "w") as fid:
for file in uifiles:
resultfile = convertUIFilename(file)
fid.write(ui_exe + " " + file + " -o " + resultfile + "
")
os.system("generateUIC.bat")
def generateMOCResult(path):
mocfiles = getAllFilesWithSuffixAndContain(path, moc_original_suffix, moc_content)
with open("generateMOC.bat", "w") as fid:
for file in mocfiles:
resultfile = convertMOCFilename(file)
fid.write(moc_exe + " " + file + " -o " + resultfile + "
")
os.system("generateMOC.bat")
当执行完脚本之后,再执行cmake中的generator,这样会将生成的文件添加到visual studio c++项目中。
另外在构建的时候发现,到执行moc的时候,如果遇到Q_INTERFACES,那么可能会报:Undefined interface的错误,这个时候,可以参照moc'ing 'Undefined interface' with visual studio,在执行moc命令的时候追加-I
路径即可。
其他额外的错误,按照编译错误提醒,进行处理即可。