0

Есть библиотека с заголовком App.h

namespace Test 
{
 int AppStart();
}

И cpp файлом main.cpp

#include "App.h"
extern int Test::AppStart();
int main() {
    return Test::AppStart();
}

В другом исполняемом проекте файл App.cpp

#include <App.h>
#include <iostream>
int Test::AppStart() 
{
    std::cout << "App Start" << std::endl;
    return 0;
}

Ошибка: main.obj : error LNK2019: ссылка на неразрешенный внешний символ "int __cdecl Test::AppStart(void)" (?AppStart@Test@@YAHXZ) в функции main

  • А прошла ли успешно компиляция app.cpp? у вас в нем #include <App.h> с угловыми скобками... Потому что как только я это изменил, у меня все нормально скомпилировалось и собралось... – Harry Dec 10 '21 at 05:11
  • App.cpp должно быть в библиотеке, а main.cpp - в исполняемом проекте. В App.h должны быть include guards. А вот extern int Test::AppStart(); быть не должно. – user7860670 Dec 10 '21 at 05:38
  • @Harry, через кавычки тоже не помогает, файл App.obj есть. Я подключал библиотеку через ссылки в vs studio, и добавил каталоги включения в свойствах проекта. Может что не так сделал? – Cooller Floyd Dec 10 '21 at 05:41
  • @user7860670, в этом и суть. Мне нужно чтобы main был в библиотеке, она отвечала за запуск цикла программы. Это можно сделать, я уже делала только не помню как. – Cooller Floyd Dec 10 '21 at 05:43
  • Ну, еще вариант — в файле реализации создайте namespace Test — как в заголовочном — и реализуйте AppStart() внутри пространства имен, а не просто с полностью квалифицированным именем. Что-то такое у меня когда-то на VC++ (кстати, у вас какая версия?) было, такое решение работало. Проверьте... Кстати, кажется, это было, когда оформлял такие вещи в библиотеку — с классами вроде проходило нормально, а вот свободные функции пришлось заворачивать в пространства имен. – Harry Dec 10 '21 at 06:23
  • Harry, пространства имен добавил, тоже не помогло. версия 199711 (с++98 как я понимаю). Я собираю в dll. Можете скинуть свой проект, может я в свойствах не правильно указал что указал? – Cooller Floyd Dec 10 '21 at 06:41
  • Я в командной строке компилировал :) Кстати, а что получается, ели в командной строке запустить cl /EHsc main.cpp app.cpp? Еще версия — что при линковке app.obj он просто не видит, он как-то не так добавлен... – Harry Dec 10 '21 at 07:01
  • @Harry, файлы main.cpp и app.cpp в разных проектах, в разных папках, если указать полный путь к файлам, он не может найти app.h – Cooller Floyd Dec 10 '21 at 09:27
  • Похоже, он у вас из-за этого (или чего еще) не в состоянии найти объектный файл. – Harry Dec 10 '21 at 10:25

0 Answers0