Ошибка компоновки из-за невозможности правильно связать файл заголовка с файлом cpp
У меня есть два проекта в одном решении. Когда я пытаюсь получить доступ к функции одного проекта из другого, я получаю error LNK2001: unresolved external symbol
, Но ошибка компоновки возникает только тогда, когда функция объявлена в заголовочном файле, но определена в соответствующем файле cpp. Если функция определена в заголовочном файле, то ошибка не возникает. Также вызов функции из того же проекта не дает никакой ошибки. Только вызов из другого приводит к ошибке связывания.
РЕДАКТИРОВАТЬ: я использую Visual Studio 2010. Я не знаю, стоит ли упоминать, что вызываемая функция находится в проекте, который выводит файл lib, и тот, который вызывает эту функцию, выводит файл exe.
2 ответа
Если вы определите функцию в заголовочном файле, компилятор увидит реализацию функции, когда вы соберете проект.exe и скомпилируете копию кода функции непосредственно в ваш проект.exe. Когда очередь компоновщика во время сборки, ничего не пропало, так что компоновщик счастлив, и вы не получите сообщение об ошибке.
Если вы определите функцию в файле.cpp, компилятор не увидит реализацию функции. Таким образом, будет помещена ссылка на функцию (т. Е. Внешний символ), которую необходимо разрешить позже, когда наступит очередь компоновщика во время сборки. Чтобы компоновщик "увидел" внешний символ, вам нужно связать ваш.exe-проект с вашим.lib-проектом. Как только вы установили эту зависимость ссылки, компоновщик сможет найти внешний символ и разрешить ссылку на функцию, которая была ранее сгенерирована компилятором. Поскольку у вас есть проект.lib, который является проектом статической библиотеки, компоновщик разрешает символ, собирая код функции из файла.lib и помещает копию кода в ваш файл.exe.
Так много для теории. Теперь, возможно, самый простой способ сделать ссылку на проект.exe для вашего проекта.lib - добавить ссылку:
- В настройках проекта.exe выберите раздел "Общие свойства" в верхней части списка разделов.
- Теперь вы должны увидеть список ссылок, которые есть у проекта.exe. Список, вероятно, пуст.
- Нажмите кнопку "Добавить новую ссылку" в нижней части диалогового окна и добавьте проект.lib в качестве ссылки.
- При выборе новой ссылки в списке ссылок вы увидите набор свойств для этой ссылки. Убедитесь, что для свойства "Зависимости библиотеки ссылок" установлено значение true. Это приведет к автоматическому добавлению проекта.lib в качестве входных данных для компоновщика при сборке проекта.exe.
Если вы создаете свой.exe проект, ошибка компоновщика должна исчезнуть.
Кстати, добавив ссылку на проект, вы также сказали Visual Studio построить два проекта в правильном порядке, если вы строите полное решение: сначала проект.lib, затем проект.exe.
Это роль компоновщика для разрешения неизвестных символов.
Таким образом, если projet A использует методы из projet B, определенные в файле cpp, вам нужно связать A с B.
Как уже говорилось, было бы хорошо иметь больше информации об обоих проектах, IDE (визуальный???)...