0

我们正在使用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 正常生成。

那么为什么会出现这个错误呢?

4

1 回答 1

0

问题确实来自自定义与项目设置的设置,配置将通过链接器的三种情况:

1:在发布模式下,指定\MT
2:在发布模式下,指定\MTd,在预处理器定义中添加“ITERATOR_DEBUG_LEVEL=0”。
3:在调试模式下,指定\MTd,在预处理器定义中添加“ITERATOR_DEBUG_LEVEL=0”。

请注意,在调试模式下,指定编译选项 \MT 不会通过链接器,确切原因尚不清楚,但如果这样做则不起作用。(发生一些 LNK 错误 2001 和 2005)。

似乎 ITERATOR_DEBUG_LEVEL 被 Scons 默认为 0,相比之下,发布模式下的默认值是 0,而调试模式下的默认值是默认值 vs 设置的默认值是 2。另外,我怀疑 \MTd 是由 Scons 默认设置的。任何使用 Scons 的用户都应该非常小心。

于 2015-05-25T14:46:48.140 回答