openfilpper 软件编译问题记录

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路径即可。

其他额外的错误,按照编译错误提醒,进行处理即可。

原文地址:https://www.cnblogs.com/grass-and-moon/p/14120169.html