c++ - 主 Makefile 中 undefined reference

标签 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 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;
};

数据库.cpp

#include "database.h"
mydatabase::mydatabase(int a ,int b):m_a(a) , m_b(b)
{
}

建立数据库

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

project/Main folder 有文件 main.cpp , Makefile

main.cpp

#include "database.h"
#include <iostream>
int main()
{
    mydatabase *obj = new mydatabase(10 ,5);
    std::cout<<"sum is"<<obj->sum()<<endl;
    std::cout<<"diff is"<<obj->diff()<<endl;
    std::cout<<"mul is"<<obj->mul()<<endl;
    std::cout<<"div is"<<obj->div()<<endl;
    std::cout<<"reminder is"<<obj->reminder()<<endl;
    getchar();
    return 0;
}

生成文件

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

问题: 数据库 make 文件工作正常但主 Makefile 我遇到了一些问题,例如

错误: main.o:在函数 main' 中: main.cpp:(.text+0x92): undefined reference mydatabase::mydatabase(int, int)' collect2: ld 返回 1 个退出状态

最佳答案

这一行是错误的:

$(CC) $(CFLAGS) -o testdate $(LDFLAGS) main.o

因为库应该在行上的对象 main.o 之后指定。这是由于链接器处理对象的方式。看这个例子:

gcc -o test someobject.o library.a

链接器将:

  1. 查找someobject.o的所有 undefined reference 并存储它们
  2. 然后它打开 library.a 并通过 library.a 解析 undefined reference
  3. 然后关闭library.a

如果对象和库是相反的,则链接器打开 library.a,在其表中没有看到 undefined reference 并将其关闭。然后它尝试编译 someobject.o 并且永远不会满足 undefined reference

编辑: 这是一个众所周知的GCC caveat,更详细的stack-overflow解释可以看here和选项 --start-group--end-group 可以帮助解决 A 依赖 B,B 依赖 A 的情况。

关于c++ - 主 Makefile 中 undefined reference ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21349928/

相关文章:

c - 当我尝试构建时,Eclipse CDT 不使用我的 Makefile。

bash - 终端查找,目录最后而不是第一个

c++ - 如何将数字添加到字符串?

c++ - 获取 LNK1104 : cannot open file "libssl.obj"

c++ - 非标量类型子类错误

C++ 虚拟性示例

linux - 删除行中的空格和数字,直到行中的第一个字符

linux - 如何执行shell脚本?

linux - net_device get_stats函数,如何使用?

macos - libgomp 和 MacOsx