遇到问题及解决方案:
1)c:\pbrt-v1\pbrt-1.05\core\exrio.cpp(29):fatal error C1083: Cannot open include file: 'ImfInputFile.h': No such file ordirectory
在core项目的属性里VC++Directories中的Include Directories中加入:C:\Deploy\include
2)c:\pbrt-v1\pbrt-1.05\core\pbrtlex.cpp(771):fatal error C1083: Cannot open include file: 'unistd.h': No such file ordirectory
在core目录下新建文件unistd.h。内容如下:
#ifndef _UNISTD_H
#define _UNISTD_H
#include <io.h>
#include <process.h>
#endif /* _UNISTD_H */
3)c:\program files(x86)\microsoft visual studio 10.0\vc\include\math.h(167): error C2733: secondC linkage of overloaded function 'hypot' not allowed
解决方法,在exrio.cpp文件中,注释掉
#define hypotf hypot
4)将core项目右键->Properties->Linker->General->AdditionalLibrary Directories改为C:\Deploy\lib\Win32\Release
5)由于我用的是ZLIB-1.2.5版本,其对应的dll和lib分别为zlibwapi.dll和zlibwapi.lib
将core右键->Properties->Linker->AdditionalDependecies,将其改为:
Half.lib
Iex.lib
IlmImf.lib
Imath.lib
zlibwapi.lib
IlmThread.lib
6)1>exrio.obj : errorLNK2001: unresolved external symbol "private: static union half::uif const* const half::_toFloat" (?_toFloat@half@@0QBTuif@1@B)
1>exrio.obj : error LNK2001: unresolved external symbol"private: static unsigned short const * const half::_eLut"(?_eLut@half@@0QBGB)
解决方案:在core右键->Properties->C/C++->Preprocessor->PreprocessorDefinition部分加入OPENEXR_DLL
7)C:\Program Files(x86)\MSBuild\Microsoft.Cpp\v4.0\Platforms\Win32\Microsoft.Cpp.Win32.Targets(392,5):error MSB6003: The specified task executable "link.exe" could not berun. The process cannot access the file'C:\pbrt-v1\pbrt-1.05\win32\Projects\Debug\link.read.1.tlog' because it is beingused by another process.
原因:多个项目将tlog文件输出到同一目录,导致冲突。
解决方法:发现所有项目的IntermediateDirectory指定到不同的目录。项目属性->ConfigurationProperties->General->Intermediate Directory。原来为Debug\,将其改为../tmp/$(ProjectName)/
8.luxrender.exe : general error c101008d: Failed to write the updated manifest to the resource of file ".\Release\jiaoshi.exe".
解决办法,那就是在项目属性——配置属性——链接器——清单文件中, 把生成清单改成否就行了。
经过进一步的探索,发现在项目属性——配置属性——清单工具——输入和输出中,把嵌入清单改成否也行。
然而,问题虽然解决了,原因却还不明。因为,既然生成清单和嵌入清单是微软的默认设置,为什么却会出现错误呢?第一种方法的作者认为清单是.net程序 (托管程序)需要的,所以去掉后便能正常生成了,然而后一种方法仍然生成了清单,而且也能正常运行又作何解,而且微软的说明中也没有提到清单只是为CLR 程序准备的,而是应该所有程序都要加上清单。
更新:还有一种更简单的方法:如果编译前将所有打开的与该项目有关的文件都关掉,也可以解决问题。
最终原因已查明
由于VC需要把生成的文件中嵌入MANIFEST文件,而由于杀毒软件之类的会握有这个文件句柄(因为杀毒软件
发现这个EXE,DLL正在读写),于是VC就写不进去了,方法是暂时关闭杀毒软件,这样就不用
改写MANIFECT