C++ 主生成文件中未定义的引用

C++ 主生成文件中未定义的引用,c++,linux,makefile,C++,Linux,Makefile,我在linux中做了一个示例项目,但在运行主Makefile时出错 项目信息: 项目/数据库文件夹包含文件database.h、database.cpp、bulid database、Makefile 数据库.h /*data base file*/ #include<iostream> using namespace std; class mydatabase { public: mydatabase(int a , int b); int sum(){return

我在linux中做了一个示例项目,但在运行主Makefile时出错

项目信息:

项目/数据库文件夹包含文件database.h、database.cpp、bulid database、Makefile

数据库.h

/*data base file*/
#include<iostream>
using namespace std;
class mydatabase
{
public:
    mydatabase(int a , int b);
    int sum(){return m_a +m_b;}
    int diff(){return m_a -m_b;}
    int mul(){return m_a *m_b;}
    float div(){return m_a /m_b;}
    int reminder(){return m_a %m_b;}

private:
    int m_a , m_b;
};
bulid数据库

make
if [ -f libdatabase.a ];
then
   echo "Database-Library Build Success"
   cp libdatabase.a ../LIBs/
else
    echo "databse-Library Build Failure"
fi
HEADERFILES = $(wildcard *.h)
CPPFILES = $(wildcard *.cpp)
OBJFILES = $(patsubst %.cpp,%.o ,$(wildcard *.cpp))
$(OBJFILES): %.o : %.cpp $(HEADERFILES)
    g++ -c -o $@ $<
    ar ruv libdatabase.a $@
    ranlib libdatabase.a
CC        = g++
INCPATH  = -I. \
       -I.. \
       -I../database
LIBPATH  = -L../LIBs
LDFLAGS   = ${LIBPATH}/libdatabase.a
CFLAGS    = ${INCPATH} 
testdate:main.o
    $(CC) $(CFLAGS) -o testdate main.o $(LDFLAGS)
main.o:main.cpp
    $(CC) $(CFLAGS) -c -o main.o main.cpp
Makefile

make
if [ -f libdatabase.a ];
then
   echo "Database-Library Build Success"
   cp libdatabase.a ../LIBs/
else
    echo "databse-Library Build Failure"
fi
HEADERFILES = $(wildcard *.h)
CPPFILES = $(wildcard *.cpp)
OBJFILES = $(patsubst %.cpp,%.o ,$(wildcard *.cpp))
$(OBJFILES): %.o : %.cpp $(HEADERFILES)
    g++ -c -o $@ $<
    ar ruv libdatabase.a $@
    ranlib libdatabase.a
CC        = g++
INCPATH  = -I. \
       -I.. \
       -I../database
LIBPATH  = -L../LIBs
LDFLAGS   = ${LIBPATH}/libdatabase.a
CFLAGS    = ${INCPATH} 
testdate:main.o
    $(CC) $(CFLAGS) -o testdate main.o $(LDFLAGS)
main.o:main.cpp
    $(CC) $(CFLAGS) -c -o main.o main.cpp
问题:数据库生成文件工作正常,但主生成文件出现以下问题

错误:main.o:在函数
main'中:
main.cpp:(.text+0x92):对
mydatabase::mydatabase(int,int)”的未定义引用
collect2:ld返回了1个退出状态

这是您的
生成文件
。你想要:

libdatabase.a

main
编译行的末尾

这一行是错误的:

$(CC) $(CFLAGS) -o testdate $(LDFLAGS) main.o
因为库应该在行中的对象
main.o
之后指定。这是由于链接器处理对象的方式。看看这个例子:

gcc -o test someobject.o library.a
链接器将:

  • 查找
    someobject.o的所有未定义引用并存储它们
  • 然后打开
    library.a
    ,并通过
    library.a
  • 然后关闭
    库。a
  • 如果对象和库的位置相反,则链接器将打开
    库。a
    ,在其表中看不到未定义的引用,并将其关闭。然后它尝试并编译
    someobject.o
    ,而未定义的引用永远不会得到满足

    编辑
    这是众所周知的GCC警告,可以看到更详细的堆栈溢出解释,选项
    --start group
    --end group
    可以帮助解决a依赖于B,B依赖于a的情况。

    如果要使用
    new
    ,则必须
    在使用完该对象后删除该对象。