Невозможно связать заголовок и файл cpp одного проекта из другого LNK2019: неразрешенная внешняя ошибка символа
У меня есть заголовочный файл Ах
namespace DIV
{
int Fun();
}
Исходный файл A.cpp
namespace DIV
{
class A
{
public:
A(){}
~A(){}
int Fun();
};
int A::Fun()
{
return 0;
}
}
Теперь у меня есть другой исходный файл B.cpp в другом проекте того же решения.
Этот источник использует каркас GTest от Google. Внутри тестовой функции я использую
#include "gtest/gtest.h"
#include "A.h"
TEST(FunTest, Param)
{
int value = DIV::Fun();
}
Из-за DIV::Fun()
вызов я получаю ошибку компоновщика. Я не понимаю причину ошибки компоновщика.
РЕДАКТИРОВАТЬ: B.cpp находится в проекте.exe и Ah/cpp в проекте lib.
3 ответа
Проблема решена. Я получил ответ отсюда. Подводя итог, мне нужно было связать мой exe-проект с lib-проектом, который содержит функцию fun()
, Теперь, возможно, самый простой способ сделать ссылку на проект.exe для проекта.lib - добавить ссылку:
- В настройках проекта.exe выберите раздел "Общие свойства" в верхней части списка разделов.
- Теперь вы должны увидеть список ссылок, которые есть у проекта.exe. Список, вероятно, пуст.
- Нажмите кнопку "Добавить новую ссылку" в нижней части диалогового окна и добавьте проект.lib в качестве ссылки.
- При выборе новой ссылки в списке ссылок вы увидите набор свойств для этой ссылки. Убедитесь, что для свойства "Зависимости библиотеки ссылок" установлено значение true. Это приведет к автоматическому добавлению проекта.lib в качестве входных данных для компоновщика при сборке проекта.exe.
После этого ошибка компоновщика пропала.
С внешним и без внешнего ключевого слова это работает. Вам нужно экспортировать свою функцию fun в другие модули / проекты. Используйте __declspec (dllexport).
Какова цель вашего использования extern
Вот? Поскольку функции имеют внешнюю связь по умолчанию, функции маркировки extern
по этой причине не нужно. Однако это не должно вызывать ошибку компоновщика в этом случае.
Ошибка компоновщика указывает, что определение функции найдено, но объектный файл не связан должным образом. Как вы компилируете и связываете программу?
РЕДАКТИРОВАТЬ:
Поскольку A.cpp не находится в том же проекте, что и B.cpp, вам необходимо явно указать ссылки на объектные файлы в вашем проекте A.cpp. Так как кажется, что вы используете Visual Studio, вы можете найти это полезным
Как вы делитесь кодом между проектами / решениями в Visual Studio?