最近一直在尝试编译OpenSees的源代码,但是问题多多,并不是很容易解决,先一步一步的走,目前遇到最多的就是OpenSees在编译过程中出现Error C3861和C2039的错误,之所以记录下来是因为这个错误好多个版本都会出现,写这篇文章的时候版本已经是r5953了,相比于r5855,增加了win64的支持,但是还是会出很多的问题,记录记录。
环境:
OS: Windows 8.1 x64 ,
tcl: 8.5.16,
OPS_VERSION “2.4.5 (rev 5855)”
Microsoft Visual C ++ 2013 Ultimate
release x64
出现问题:
1 2 3 4 |
Error 1503 error C3861: 'max': identifier not found C:\Users\ahmed\Desktop\trial1\trunk\SRC\element\elastomericBearing\ElastomericX.cpp 413 Error 1514 error C3861: 'max': identifier not found C:\Users\ahmed\Desktop\trial1\trunk\SRC\element\elastomericBearing\LeadRubberX.cpp 441 Error 1564 error C2039: 'max' : is not a member of 'std' C:\Users\ahmed\Desktop\trial1\trunk\SRC\material\nD\UWmaterials\ManzariDafalias.cpp 1132 Error 1781 error LNK1181: cannot open input file 'cssparse.lib' C:\Users\ahmed\Desktop\trial1\trunk\Win32\proj\openSees\LINK |
如下图所示:
这个问题主要是出现在std的命名空间中,在ElastomericX.cpp、LeadRubberX.cpp和ManzariDafalias.cpp中的max和min函数没有在std命名空间,这里在OpenSees的论坛上看到了一个比较好的解决办法。
在出问题的cpp文件中,宏定义部分增加:
1 2 |
#define min(a,b) ((a) <= (b) ? (a) : (b)) #define max(a,b) ((a) >= (b) ? (a) : (b)) |
并且在增加上部分定义之后,删除std::前缀,即可顺利通过编译。