Меня попросили помочь коллеге по поводу загадочной ошибки сборки в одном из проектов в общем решении. Ошибка компоновки происходит на этапе компоновки, конструктор класса, определенный в статической библиотеке (a.lib), не обнаруживается, когда он используется в библиотеке (b.lib), которая включает этот файл a.lib. После тщательного расследования я выяснил, что:
Файл vcxproj ClCompile ItemGroup:
...
<ClCompile Include="Source\CMYKOVBLab.cpp" />
<ClInclude Include="Source\CMYKOBGLab.cpp" /> <--- The file is here.
<ClCompile Include="Source\CMYKOVBRGB.cpp" />
...
Таким образом, то, что необходимо для связи библиотеки, есть, но ошибка связи сохраняется.
Одна странная вещь, которую я заметил, это то, что cpp с не найденным конструктором класса не может быть скомпилирован нажатием Ctrl-F7 или правой кнопки в a.lib. Эта опция недоступна, но только для этого конкретного файла. Более того, когда я собираю библиотеку a.lib, где этот файл должен быть скомпилирован, это не так, и поэтому объектный файл не создается.
В чем может быть причина? Как я могу это исправить?
Я использую Visual Studio Professional 2015 с обновлением 3.
В VS 2015 включаются файлы компиляции, определенные в.vcxproj файл проекта, как ожидается, будет в лексикографический порядок.
Это больше не нужно в VS 2017, но когда это не соблюдается, VS 2015 может создать такой хаос.
Ваш коллега имеет изменено вручную .vcxproj файл проекта для включения этого файла, но он не соблюдает лексикографический порядок. Вам нужно просто удалить файл из проекта а также добавить его снова. Visual Studio включит его в правильное место и ваша сборка будет успешной.
Надеюсь, что это может помочь другим людям.
Других решений пока нет …