我们正在使用SCons构建我们的项目,包括生成静态库和Visual Studio项目文件(.sln,.vcxproj)之类的东西。在SConstruct文件(用Python编写)中,我们指定:
CCFLAGS=['/Od','/Zi','/EHsc','/W3']
env=Environment(ENV=ENV,CPPPATH=include_path,CCFLAGS=CCFLAGS,MSVS_ARCH=arc,TARGET_ARCH=arc)
lib=env.StaticLibrary(target=lib_file,source=lib_src_files)
proj=env.MSVSProject(target=name+env['MSVSPROJECTSUFFIX'],srcs=lib_src_files,incs=lib_header_files,buildtarget=lib,variant=build_type,auto_build_solution=0)
生成我们的VS项目文件和静态库。一切顺利,我们终于得到了我们的图书馆。 但是当我们在其他自定义项目中将这些库用作第三方库时,它会生成lnk2009 error
:
error 1 error LNK2019: unresolved external symbol "public: virtual
__thiscall Physika::Vector<double,3>::~Vector<double,3>(void)" (??1?$Vector@N$02@Physika@@UAE@XZ),referenced in function
_tmain() C:\Users\suitmyself\documents\visual studio 2010\Projects\Physika_config\Physika_config\vector3d_test.obj
error 2 error LNK2019: unresolved external symbol "public: __thiscall Physika::Vector<double,3>::Vector<double,3>(double,double,double)" (??0?$Vector@N$02@Physika@@QAE@NNN@Z),referenced in function
_tmain() C:\Users\suitmyself\documents\visual studio 2010\Projects\Physika_config\Physika_config\vector3d_test.obj
请注意,此处的VS项目是手动生成的。我们确保包含路径(头文件)和库路径,库文件配置没有错误,并且库文件被正确找到。似乎.obj根本无法与库文件中的正确符号匹配,从而导致此lnk错误。
然而,奇怪的是,如果我们使用SCons构建我们的VS项目并如上所述指定CCFLAGS,一切正常,没有检测到lnk错误并且正常生成EXE。那么为什么会出现这个错误?
答案 0 :(得分:0)
问题确实来自自定义vs proj设置的设置,有三种情况配置将通过链接器:
1:在发布模式下,\ MT指定了
2:在发布模式下,\ MTd 指定,在预处理器定义中添加“ITERATOR_DEBUG_LEVEL = 0” 3:在调试模式下,指定\ MTd,在其中添加“ITERATOR_DEBUG_LEVEL = 0” 预处理器定义。
请注意,在调试模式下,指定编译选项\ MT将不会传递链接器,原因仍然不清楚,但如果执行此操作则不起作用。(某些LNK错误2001和2005发生)。
似乎Scons的ITERATOR_DEBUG_LEVEL默认为0,而在发布模式下默认值为0,默认值为2,默认值为2。另外,我怀疑\ MTd默认是由Scons设置的。任何使用Scons的用户都应该非常谨慎。