主要makefile中的未定义参考
Undefined reference in main Makefile
我在Linux中做了一个示例项目,但是在运行MaineFile
时我会遇到错误项目信息:
project/database文件夹具有文件database.h,database.cpp,bulid-database,makefile
database.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;
};
database.cpp
#include "database.h"
mydatabase::mydatabase(int a ,int b):m_a(a) , m_b(b)
{
}
Bulid-Database
make
if [ -f libdatabase.a ];
then
echo "Database-Library Build Success"
cp libdatabase.a ../LIBs/
else
echo "databse-Library Build Failure"
fi
makefile
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文件夹有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;
}
makefile
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我有一些问题,例如
错误: main.o:在函数main':
main.cpp:(.text+0x92): undefined reference to
myDatabase :: myDatabase(int,int)'收集2:LD返回1退出状态
此行是错误的:
$(CC) $(CFLAGS) -o testdate $(LDFLAGS) main.o
应该在行上的对象main.o
之后指定库。这是由于链接器处理对象的方式。查看此示例:
gcc -o test someobject.o library.a
链接器将:
- 查找
someobject.o
的所有未定义引用并存储它们 - 然后打开
library.a
并通过library.a
解决未定义的参考 - 然后关闭
library.a
如果对象和库以相反的方式,则链接器打开library.a
,在其表中没有不确定的引用并将其关闭。然后,它尝试和编译someobject.o
,而未定义的参考文献永远不会满足
编辑:这是GCC的众所周知的警告,这里可以看到更详细的堆栈跨流说明,并且选项--start-group
和--end-group
可以帮助解决A的依赖B的情况,而B取决于A。
是您的Makefile
。您想要:
libdatabase.a
或
-ldatabase
在main
编译线的末尾
相关文章:
- GTest EXPECT_EQ给出未定义的错误参考
- 在VSCode中编译C++给了我一个未定义的参考
- Armadillo正在为共享的lapack库获取未定义的参考
- 我对C++程序有一个未定义的参考,不知道如何处理它
- 使用Arduino IDE的构造函数的未定义参考错误
- 在C++中使用 CImg 的未定义参考错误
- gtest的未定义参考
- 未定义参考 cv::鱼眼::校准
- WEBRTC的未定义参考
- 如何编译ZBAR示例?(未定义参考..)
- 针对C 库链接时的未定义参考
- 命名空间外部变量的未定义参考/多重定义,C 结构问题
- 简单QT程序中的未定义参考
- 主要makefile中的未定义参考
- C 标题中的外部变量的未定义参考
- 对[class::function]的未定义引用/对[class]的typeinfo的未定义参考
- icu 54-未定义参考
- 信号上的QT未定义参考编译错误
- boost 1.58未定义参考
- QT未定义参考错误(Qextserialport)