2017-01-22 5 views
3

У меня есть тестовое приложение и статическая библиотека. Проблема неопределенной ссылки на методы класса 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

+0

1.) Действительно ли 'libDeka.a' содержит функции? 2.) Есть ли вероятность, что на вашем компьютере плавает другой файл 'libDeka.a', а g ++ случайно подбирает неправильный? –

+1

1) libDeka определенно имеет функции 2) libDeka.a - это только один файл в папке и не существует в любом пути в значении PATH –

+0

Работает ли он с 'ar rcs', а не просто с' ar rc'? –

ответ

0

От https://gcc.gnu.org/onlinedocs/gcc/Link-Options.html

-l библиотека . .. Это имеет значение, когда в команде вы пишете эту опцию; компоновщик ищет и обрабатывает библиотеки и объектные файлы в том порядке, в котором они указаны. Таким образом, «foo.o -lz bar.o» ищет библиотеку «z» после файла foo.o, но до bar.o. Если bar.o относится к функциям в 'z', эти функции могут не загружаться.

Средства, необходимые для размещения main.o до -lDeka. Изменение порядка в вашей директиве ссылка:

$ (LINK) $ (LINKFLAGS) main.o -o test.exe

изменить его так, что main.o появляется перед -lDeka.

0

Добавить log.o к главной цели:

all: main.o libDeka.a log.o 
+0

Я полагаю, что OP хочет разрешить ссылки через библиотеку libDeka, а не добавлять все из библиотеки вручную. –

+0

@ Христиан Хакл Что я должен делать? –

+0

@lorro Например, в библиотеке SDL нет необходимости включать объектные файлы, что я должен делать с чем-то также в SDL –

0

Является ли третья строка в вашем файле makefile LIBARIES=-lDeka правильной? Не должно быть LIBRARIES=-lDeka?

+0

Я плохой на английском. Это проблема, но основная проблема решена. –

 Смежные вопросы

  • Нет связанных вопросов^_^