未定义的类方法引用

时间:2017-01-22 10:57:58

标签: c++ g++ static-libraries

我有一个测试应用和静态库。问题未定义引用类Log的方法,但我在代码中找不到错误。

complie的日志:

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

生成文件

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

3 个答案:

答案 0 :(得分:0)

log.o添加到主目标:

all: main.o libDeka.a log.o

答案 1 :(得分:0)

来自https://gcc.gnu.org/onlinedocs/gcc/Link-Options.html

  

-l库   ...   它在您编写此选项的命令中有所不同;链接器按照指定的顺序搜索和处理库和目标文件。因此,'foo.o -lz bar.o'在文件foo.o之后但在bar.o之前搜索库'z'。如果bar.o引用'z'中的函数,则可能无法加载这些函数。

表示您需要在main.o之前放置-lDeka。更改链接指令中的顺序:

  

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

进行更改,以便在main.o之前显示-lDeka

答案 2 :(得分:0)

makefile input -----1--1-1--2-3--3--3---5-| output -----1-------2-3---------5-| 中的第三行是否正确?不应该是LIBARIES=-lDeka