Невозможно связать заголовок и файл 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?

Другие вопросы по тегам