VeloView源码编译错误记录——VS manifest

编译环境

Win7

Visual Studio 2008

Win32

VeloView依赖关系

1)底层

Python

Qt

pcap

boost

eigen

2)中层

liblas: boost

PythonQt: Python, Qt

paraview: PythonQt, Python, Qt

3)顶层

veloview: all

Qt的编译

Qt源码:qt-everywhere-opensource-src-4.8.6.tar.gz

Qt工程目录:%PRJ_ROOT%\qt

Qt输出目录:%PRJ_ROOT%\qt\src\qt\bin

Qt安装目录:%PRJ_ROOT%\install\bin

 

Qt的编译和安装过程很顺利, 但是在编译后续项目PythonQt等时出现错误,检查发现 %PRJ_ROOT%\install\bin下的moc.exe、uic.exe和rcc.exe三个关键程序不能正常运行,出现如下错误:

 

但是检查%PRJ_ROOT%\qt\src\qt\bin目录下的相应程序后则可正常运行,只是每个程序多了一个manifest文件。

moc.exe.manifest内容如下:

 1 <?xml version='1.0' encoding='UTF-8' standalone='yes'?>
 2 <assembly xmlns='urn:schemas-microsoft-com:asm.v1' manifestVersion='1.0'>
 3   <trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
 4     <security>
 5       <requestedPrivileges>
 6         <requestedExecutionLevel level='asInvoker' uiAccess='false' />
 7       </requestedPrivileges>
 8     </security>
 9   </trustInfo>
10   <dependency>
11     <dependentAssembly>
12       <assemblyIdentity type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' publicKeyToken='6595b64144ccf1df' language='*' processorArchitecture='*' />
13     </dependentAssembly>
14   </dependency>
15   <dependency>
16     <dependentAssembly>
17       <assemblyIdentity type='win32' name='Microsoft.VC90.CRT' version='9.0.21022.8' processorArchitecture='x86' publicKeyToken='1fc8b3b9a1e18e3b' />
18     </dependentAssembly>
19   </dependency>
20 </assembly>

 

于是把相应的manifest文件复制到%PRJ_ROOT%\install\bin目录下,但是仍然不能正常运行。

经测试,当moc.exe和moc.exe.manifest所在目录下没有子目录时可以正常运行,如果有子目录则不一定。

现在确定和程序的依赖项定位有关,查了manifest文件的简单介绍,但是仍然没有搞明白。

最后贴上一个只能算是规避问题的解决方法

程序重定向(类似于程序的快捷方式)

xxx.exe源码

#include <Windows.h>  
#include<iostream>
#include<fstream>
#include<string>
using namespace std;

int main(int argc, char** argv)
{
    // 获取程序的当前路径
    char exeFullPath[MAX_PATH]; 
    string strPath = "";
    GetModuleFileName(NULL,exeFullPath,MAX_PATH);
    strPath=(string)exeFullPath; 

    int pos = strPath.find_last_of('\\', strPath.length());
    string exeDir = strPath.substr(0, pos + 1);
    string exeName = strPath.substr(pos+1,strPath.length()-pos-5);
    string xxx_redirect_cfg = exeDir + exeName + ".cfg";
     //读取xxx.cfg 得到xxx.exe实际位置
    ifstream fin;
    fin.open(xxx_redirect_cfg.c_str());
    if(! fin.is_open())
    {
        cout << "can not open " << xxx_redirect_cfg << endl;
        return -1;
    }
    string  xxx_real_path = exeDir;
    string relative_path;
    fin >> relative_path;
    xxx_real_path += relative_path;
    cout << "redirect to "<< xxx_real_path << endl;
    // 参数传递
    string str_cmd = xxx_real_path;
    for(int i = 1; i < argc; ++i)
    {
        str_cmd += " ";
        str_cmd += argv[i];
    }
    
    cout << "str_cmd: " << str_cmd << endl;
    system(str_cmd.c_str());
    return 0;
}

 xxx.cfg

../redirect/moc.exe

只要把生成的程序xxx.exe重命名为对应的程序名,如moc.exe。然后在moc.cfg里指定moc.exe实际所在位置,就可以了。

2017-11-24

posted on 2017-11-24 15:58  水木颛顼  阅读(486)  评论(0编辑  收藏  举报

导航