Мы используем 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-файла.
Так почему эта ошибка появляется?
Вопрос действительно возникает из-за настройки пользовательских настроек против proj, есть три случая, когда конфиг передает компоновщик:
1: в режиме релиза \ MT указано
2: в режиме выпуска, \ MTd
указано, добавить «ITERATOR_DEBUG_LEVEL = 0» в определении препроцессора.
3: В режиме отладки, указав \ MTd, добавьте «ITERATOR_DEBUG_LEVEL = 0» в
определение препроцессора.
Обратите внимание, что в режиме отладки указание параметра компиляции \ MT не пропустит компоновщик, точная причина остается неясной, но он не работает, если вы это сделаете (происходят некоторые ошибки LNK 2001 и 2005).
Похоже, что значение ITERATOR_DEBUG_LEVEL по умолчанию равно 0 для Scons, по сравнению со значением по умолчанию, равным 0 в режиме выпуска, и значением по умолчанию, равным 2 в режиме отладки, для настройки по умолчанию против настройки. Кроме того, я подозреваю, что Scons по умолчанию устанавливает \ MTd. Любой пользователь, использующий Scons, должен быть очень осторожен с этим.