C++ 对类的方法的未定义引用

C++ 对类的方法的未定义引用,c++,g++,static-libraries,C++,G++,Static Libraries,我有一个测试应用程序和静态库。该问题未定义对类Log方法的引用,但我在代码中找不到错误 康普利的日志: 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 ../S

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

康普利的日志:

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

main.cpp

#include "log.h"


int main(int argc, char* argv[])
{
    Log::Get()->Print("Test %d", 50);

    delete Log::Get();
    return 0;
}

以防此处的所有文件将
log.o
添加到主目标:

all: main.o libDeka.a log.o

-图书馆 ... 在命令中写入此选项的位置会有所不同;链接器按照指定的顺序搜索和处理库和对象文件。因此,'foo.o-lzbar.o'在文件foo.o之后、bar.o之前搜索库'z'。如果bar.o引用“z”中的函数,则可能不会加载这些函数

意味着您需要将
main.o
放在
-lDeka
之前。更改链接指令中的顺序:

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


更改它,使
main.o
出现在
-lDeka

生成文件
LIBARIES=-lDeka
中的第三行是否正确?是不是应该是
LIBRARIES=-lDeka

我想OP希望通过
libDeka
库解析引用,而不是手动添加库中的所有内容。@Christian Hackl我必须做什么?@lorro例如,SDL库不需要包含对象文件,我必须对SDL1中的某些东西做些什么。)
libDeka.a
实际上包含函数吗?2)是否有可能存在另一个
libDeka.a
文件在您的计算机上浮动,而g++意外地拾取了错误的文件?1)libDeka肯定具有函数2)libDeka.a在文件夹中只有一个文件,并且在路径值中不存在任何路径,它是否与
ar rcs
一起工作,而不是与
ar rc
一起工作
ar rcs
我英语不好。这是个问题,但主要问题已经解决了。
#include "log.h"


int main(int argc, char* argv[])
{
    Log::Get()->Print("Test %d", 50);

    delete Log::Get();
    return 0;
}
all: main.o libDeka.a log.o