У меня есть тестовое приложение и статическая библиотека. Проблема неопределенной ссылки на методы класса Log, но я не могу найти ошибку в коде.undefined ссылка на методы класса
Журналы Скомпилируйте:
g++ -c -O0 -std=c++14 -Wall -I ../SDL_DekaLib/include main.cpp -o main.o
g++ -c -O0 -std=c++14 -Wall -I ../SDL_DekaLib/include log.cpp -o log.o
ar rc libDeka.a log.o
g++ -O0 -std=c++14 -Wall -I ../SDL_DekaLib/include -L . -lDeka main.o -o test.exe
main.o:main.cpp:(.text+0x10): undefined reference to `Log::Get()'
main.o:main.cpp:(.text+0x28): undefined reference to `Log::Print(char const*, ...)'
main.o:main.cpp:(.text+0x2d): undefined reference to `Log::Get()'
main.o:main.cpp:(.text+0x3a): undefined reference to `Log::~Log()'
collect2.exe: error: ld returned 1 exit status
Makefile
CC=g++
LINK=g++
LIBARIES=-lDeka
CFLAGS= -c -O0 -std=c++14 -Wall -I ../SDL_DekaLib/include
LINKFLAGS= -O0 -std=c++14 -Wall -I ../SDL_DekaLib/include -L . $(LIBARIES)
all: main.o libDeka.a
$(LINK) $(LINKFLAGS) main.o -o test.exe
main.o: main.cpp
$(CC) $(CFLAGS) main.cpp -o main.o
libDeka.a: log.o
ar rc libDeka.a log.o
log.o: log.cpp
$(CC) $(CFLAGS) log.cpp -o log.o
clean:
del *.o
del *.exe
del *.a
log.h
#include <cstdio>
#include <cstdlib>
#include <ctime>
#include <clocale>
#include <cstdarg>
class Log
{
public:
Log();
~Log();
static Log* Get();
void Print(const char* message, ...);
void Debug(const char* message, ...);
void Error(const char* message, ...);
private:
static Log* _instance;
FILE* _file;
void _print(const char* lvltext, const char* message);
void _init();
void _close();
};
log.cpp - без реализации
#include "log.h"
Log* Log::_instance = nullptr;
void Log::_init()
{
...
}
void Log::_close()
{
...
}
Log::Log() : _file(nullptr)
{
_init();
}
Log::~Log()
{
_close();
_instance = nullptr;
}
Log* Log::Get()
{
if(!Log::_instance)
Log::_instance = new Log();
return Log::_instance;
}
void Log::Print(const char* message, ...)
{
...
}
void Log::Debug(const char* message, ...)
{
#ifdef DEBUG
...
#endif // DEBUG
}
void Log::Error(const char* message, ...)
{
...
}
void Log::_print(const char* lvltext, const char* message)
{
...
}
main.cpp
#include "log.h"
int main(int argc, char* argv[])
{
Log::Get()->Print("Test %d", 50);
delete Log::Get();
return 0;
}
Только в случае, если все файлы здесь link
1.) Действительно ли 'libDeka.a' содержит функции? 2.) Есть ли вероятность, что на вашем компьютере плавает другой файл 'libDeka.a', а g ++ случайно подбирает неправильный? –
1) libDeka определенно имеет функции 2) libDeka.a - это только один файл в папке и не существует в любом пути в значении PATH –
Работает ли он с 'ar rcs', а не просто с' ar rc'? –