Неразрешенная ошибка ссылки на внешний символ для статических констант экспортируемого класса (только в некоторых проектах)

У меня есть класс в проекте Utils следующим образом:

Математика.h

class __declspec(dllexport) Maths
{
public:
  static const double c_epsilon;

  ...
}

Maths.cpp

const double Maths::c_epsilon = DBL_EPSILON;

Затем у меня есть (много) других проектов, которые используют этот класс (и используют константу c_epsilon).

Почти все другие проекты строятся и компонуются без проблем... но пара завершается с ошибкой:

Неразрешенный внешний символ LNK2001 "__declspec(dllimport) public: static double const Maths::c_epsilon" (__imp_?c_epsilon@Maths@@2NB)

Два неудачных проекта являются проектами Google Test и, кроме создания исполняемого файла (вместо DLL), похоже, настроены так же, как и все другие проекты.

Неудачные проекты определенно указывают файл Utils.lib.

Я могу только предположить, что это проблема с настройками проекта (поскольку с другими проектами все в порядке), но я не могу найти какие-либо настройки, которые бы отличались от этой проблемы.


person grae22    schedule 14.12.2016    source источник
comment
Вы определяете зависимость между двоичными файлами в решении?   -  person Kirill Kobelev    schedule 14.12.2016
comment
@KirillKobelev Да, я.   -  person grae22    schedule 14.12.2016
comment
Тогда AFAIK вам не нужно указывать файл .lib. Файлы lib следует использовать для библиотек DLL, которые не являются частью решения.   -  person Kirill Kobelev    schedule 14.12.2016
comment
@KirillKobelev Извините, вы правы - для проекта Utils не определена зависимость, поскольку проект не включен в решение.   -  person grae22    schedule 14.12.2016


Ответы (1)


Оказывается, проблемные проекты указали выходную папку $(OutDir) в качестве пути для поиска дополнительных зависимостей. Это проблематично, поскольку на этом этапе сборки выходная папка все еще содержит «старые» файлы lib, которые копируются на этапе после сборки (процесс, который, вероятно, следует пересмотреть).

«Старые» файлы lib были из сборки, в которой константы на самом деле не были объявлены как «const» (просто статические) — это было изменено, отсюда и возникла неразрешенная ошибка внешнего символа.

person grae22    schedule 14.12.2016