Конфиг Libs произведен строительным инструментом scons, представляющим LNK2019

Мы используем 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

Решение

Вопрос действительно возникает из-за настройки пользовательских настроек против 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, должен быть очень осторожен с этим.

0

Другие решения


По вопросам рекламы [email protected]