5 + лет спустя ... проблема (а может и многие другие) уже решена (и забыта :))
У вас есть 1 lib proj, который содержит приведенный выше код: я предполагаю, что он находится в файле .c (xx) , а не в файле .h (входит в оба проекта) и proj приложения, который использует предыдущий.
Я думал о том, какой может быть конфигурация, которая привела бы к такому поведению (сборка lib proj и приложение proj имеют эти неразрешенные внешние элементы ) и единственная конфигурация, которая стоит на ногах: lib proj неверен. Позвольте мне подробно:
- Один отсутствующий символ -
CrtDbgReport
, который говорит мне, что библиотека встроена в режим Debug .
- Тот факт, что библиотека работает нормально, говорит мне, что либо:
- lib proj в порядке, и ошибка в proj приложения.
- lib proj не в порядке (и приложение proj может или не может быть в порядке), но это статическая библиотека - и в этом случае файлы .obj просто " "объединены вместе в результирующий файл .lib - он не связан , поэтому компоновщик не ищет неразрешенные внешние элементы на этом этапе и будет искать только тогда, когда эта библиотека будет связана в исполняемый файл ( .exe или .dll ). Это подтверждается тем фактом, что я увидел libcpmtd.lib 1 в журнале ошибок: использование статической runtime library (CRT) версии (особенно в Проект, содержащий библиотеки) имеет смысл только при создании статического приложения (обычно предназначенного для работы в раздетой среде - например, в "Windows minimalistic core" , где это может понадобиться только основные библиотеки, такие как: ntdll.dll , kernel32.dll , ...).
- Тот факт, что во время ссылки (app proj) не было дублированных символов, исключает 1-й вариант.
Это лучше, если мы можем упростить среду, необходимую для воспроизведения поведения. Вы можете переключить Свойства проекта -> Свойства конфигурации -> Общие -> Тип конфигурации и изменить значение с Статическая библиотека (.lib) на Динамическая библиотека (.dll), Теперь, в конце, он скомпоновает и не сможет выплеснуть ошибки при сборке lib proj.
1 Проверка [SO]: ошибки при подключении к protobuf 3 в MSVC 2013 для получения подробной информации о типах ссылок CRT (также проверьте ссылки). Также проверьте [SO]: LNK2005 Error в CLR Windows Form для получения дополнительной информации о том, что происходит при сборке C и C ++ кода.
Несколько слов о [MSDN]: Отладка против выпуска сборок: при сборке в режиме Отладка в код незаметно добавляется некоторый код инструментария для облегчения отладки. Вот почему Отладка артефактов сборки (против их Release аналогов):
- имеют значительно больший размер.
- бежать медленнее.
Добавление кода обычно достигается за счет различий между этапами сборки (упрощенная версия):
- preprocess : определен макрос
_DEBUG
(в отличие от Release, где определено NDEBUG
). Вы можете просмотреть стандартные включаемые файлы, и вы увидите множество директив препроцессора (в основном #ifdef
s) в этих макросах. Эта фаза напрямую влияет на фазу компиляции.
- ссылка : выбраны правильные библиотеки (которые фактически содержат этот код инструментария).
Самое важное, что фазы компиляции (и косвенной предварительной обработки) и линковки должны быть синхронизированы . Это не относится к вашему lib proj, поэтому у вас несоответствие CRT (как говорится в комментарии 3 rd ). Чтобы это исправить, либо :
- изменить определение макроса
_DEBUG
/ NDEBUG
с: Свойства проекта -> C / C ++ -> Препроцессор -> Определения препроцессора - изменить тип CRT с: Свойства проекта -> C / C ++ -> Генерация кода -> Библиотека времени выполнения
Я перечислил их обоих, поскольку я не знаю, какой из них неправильный (поскольку вы хотите, чтобы параметры конфигурации соответствовали имени конфигурации ( Debug / Release )) но у меня такое ощущение, что это последнее.
Кроме того, убедитесь, что у всех проектов есть согласованные настройки, которые должны работать вместе.