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