0

Возможно, мой вопрос будет глупым, но я не могу самостоятельно разобраться в своей проблеме. Я пишу статическую библиотеку с целью использования в разных проектах. Моя проблема в следующем: С этой структурой библиотеки:

library.h

namespace myNamespace{
void fun();
}

library.cpp

#include "library.h"    
void myNamespace::fun(){
    }

Я получаю сообщение об ошибке «Неопределенная ссылка на myNamespace::fun» при попытке подключить библиотеку к другому проекту.

Когда я выполняю реализацию только в файле заголовка, проблемы не возникает. Как правильно организовать структуру библиотеки, чтобы в дальнейшем использовать только заголовочный файл (.h)?

  • @EOF нет, тут это в полной мере ни при чем. – Harry Nov 05 '21 at 07:08
  • Я думаю, что при чём. А именно "Файл с кодом не был скомпилирован. Например, в случае использования make-файла не было прописано правило построения файла, а в случае использования IDE типа Visual Studio *.cpp файл не добавлен в список файлов проекта." –  Nov 05 '21 at 07:22
  • 1
    Если собираетесь использовать только заголовочный файл, то не нужен ни файл .cpp, ни статическая библиотека. – user7860670 Nov 05 '21 at 07:52
  • я хочу использовать только файл заголовка. реализация в отдельных файлах, и их может быть несколько (скомпилированные в библиотеку). просто "static void" вне класса в статической библиотеке не используется. убрал из глобальных функций, все заработало. вопрос можно закрывать. спасибо. – Arcady Borisov Nov 06 '21 at 06:20

2 Answers2

0

Попробуйте вместо

#include "library.h"    
void myNamespace::fun(){
    }

такой вариант:

#include "library.h"    
namespace myNamespace {
    void fun(){
    }
}

Ну, а там — как обычно: скомпилировать, засунуть объектник в библиотеку, заголовочный файл включать в свою программу, библиотеку — подключать :)

Harry
  • 221,325
  • такой тоже вариант побывал. при вызове myNamespace::fun() получаю ошибку – Arcady Borisov Nov 05 '21 at 06:02
  • 1
    У меня все нормально работает. VC++ 2019. Может, вы забыли включить заголовок в программу? И еще — говоря "ошибка", ВСЕГДА УКАЗЫВАЙТЕ, КАКАЯ ИМЕННО!!! Может, вы просто опечатались? :) Как я могу знать, что у вас поломалось, если вы говорите дословно — " у меня поломка, но я не скажу, какая — не твое дело, твое дело чинить"... – Harry Nov 05 '21 at 07:08
  • Вот, смотрите — https://drive.google.com/file/d/1-wqzviR866u4j7thgiDqAia8b0AZoNee/view?usp=sharing — тут все файлы и .cmd для компиляции VC++. Все работает. – Harry Nov 05 '21 at 08:27
  • ошибка указана в описании вопроса "Я получаю сообщение об ошибке «Неопределенная ссылка на myNamespace::fun»". я использую cmake. в CMakeLists.txt строка подключения: target_link_libraries(myTest library). При компиляции не видит функции внутри Namespace, внутри класса работает без проблем – Arcady Borisov Nov 06 '21 at 03:35
  • прошу прощения но я не указал в примере кода что я в своей программе использую статическую функцию static void fun(). в этом и заключается проблема. Вот ссылка на ошибку: https://docs.microsoft.com/ru-ru/cpp/error-messages/compiler-errors-1/compiler-error-c2129?f1url=%3FappId%3DDev16IDEF1%26l%3DRU-RU%26k%3Dk(C2129)%26rd%3Dtrue&view=msvc-160 – Arcady Borisov Nov 06 '21 at 04:25
-1

Видимо верная структура такова:

library.h

namespace myNamespace{
class myClass{
public:
static void fun();
}
}

librery.cpp

#include "library.h"    
namespace myNamespace {
    void myClass::fun(){
    }
}

Без объявления в классе не обойтись.

  • А при чем тут класс? Все отлично работает и без класса. – Harry Nov 05 '21 at 07:08