学习笔记
单纯记录在ubuntu编译过程
一、在相同目录下编译多文件
main.cpp
#include <iostream>
#include "myhead.h"
using namespace std;
int main()
{
print();
Testprint();
//cout<<"Test"<<endl;
return 0;
}
myhead.h
#ifndef __myhead_h
#define __myhead_h
void print();
void Testprint();
#endif
myhead.cpp
#include <iostream>
#include "myhead.h"
using namespace std;
void print()
{
cout<<"printFunc"<<endl;
return;
}
void Testprint()
{
cout<<"TestprintFunc"<<endl;
return;
}
编写makefile
main: main.o myhead.o
g++ -o main main.o myhead.o
main.o: main.cpp
gcc -c main.cpp
myhead.o: myhead.cpp
gcc -c myhead.cpp
clear:
rm -f *.o main
1、编写完成后运行(注意权限,如果不是root在前面加上sudo)
make
生成 main.o、myhead.o和main执行文件
2、运行main查看结果
./main
3、清理文件(注意权限,如果不是root在前面加上sudo)
make clear
注:如编译过程中有遇到以下问题
main.o:在函数‘__static_initialization_and_destruction_0(int, int)’中:
main.cpp:(.text+0x38):对‘std::ios_base::Init::Init()’未定义的引用
main.cpp:(.text+0x47):对‘std::ios_base::Init::~Init()’未定义的引用
myhead.o:在函数‘print()’中:
myhead.cpp:(.text+0xa):对‘std::cout’未定义的引用
myhead.cpp:(.text+0xf):对‘std::basic_ostream<char, std::char_traits<char> >& std::operator<< <std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&, char const*)’未定义的引用
解决方案:
因使用的是c++文件编译导致的,gcc -c默认编译.c文件的,
所以需将gcc -o main main.o myhead.o修改成
gcc -o main main.o myhead.o -lstdc++
或
g++ -o main main.o myhead.o
二、在不同目录下编译多文件
如果直接使用make的话会报错,找不到myhead文件
需要通过 -I 选项 链接上去。重新编译
如果到只在Testgcc文件目录下使用gcc编译,那么就需要将makefile修改成。如需想更简单的话
如:
main.o: main.cpp myhead/myhead.h
可改成
main.o: main.cpp
main: main.o myhead.o
gcc -o main main.o myhead.o -lstdc++
main.o: main.cpp myhead/myhead.h
gcc -c main.cpp -I./myhead/
myhead.o: myhead/myhead.cpp myhead/myhead.h
gcc -c myhead/myhead.cpp -I./myhead/
clear:
rm -f *.o main
注:如果有出现以下这种错误信息,是因为空格与Tab的问题,把gcc前面的空格修改成Tab就可以了
makefile:9: *** missing separator (did you mean TAB instead of 8 spaces?)。 停止。
编译没问题:
在Testgcc目录下生成了 main.o、myhead.o与main执行文件
试着运行main执行文件
没问题,OK