Jeg*_*ggu 2 c++ linux makefile
我在linux中做了一个示例项目但是在运行main Makefile时遇到错误
项目信息:
项目/数据库文件夹,包含文件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;
};
Run Code Online (Sandbox Code Playgroud)
database.cpp
#include "database.h"
mydatabase::mydatabase(int a ,int b):m_a(a) , m_b(b)
{
}
Run Code Online (Sandbox Code Playgroud)
bulid数据库
make
if [ -f libdatabase.a ];
then
echo "Database-Library Build Success"
cp libdatabase.a ../LIBs/
else
echo "databse-Library Build Failure"
fi
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
具有文件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;
}
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
问题:数据库生成文件工作正常,但主要的Makefile我有一些问题,如
错误: main.o:在函数main':
main.cpp:(.text+0x92): undefined reference to
mydatabase :: mydatabase(int,int)'collect2:ld返回1退出状态
这条线错了:
$(CC) $(CFLAGS) -o testdate $(LDFLAGS) main.o
Run Code Online (Sandbox Code Playgroud)
因为库应该main.o
在线上的对象之后进行特定.这是由于链接器处理对象的方式.看看这个例子:
gcc -o test someobject.o library.a
Run Code Online (Sandbox Code Playgroud)
链接器将:
someobject.o
并存储它们library.a
并通过解析未定义的引用library.a
library.a
如果对象和库是相反的,那么链接器打开library.a
,在其表中看不到未定义的引用并关闭它.然后它尝试并编译,someobject.o
并且永远不会满足未定义的引用
编辑:这是一个众所周知的GCC警告,这里可以看到更详细的堆栈溢出解释,选项--start-group
和--end-group
可以帮助解决A依赖于B的情况,B依赖于A.
归档时间: |
|
查看次数: |
11000 次 |
最近记录: |