一、生成可执行文件
1、一个源文件编译
本例子主要区别.c及.cpp文件及编译该文件时使用的编译链。
1).c文件
// testadd.c
#include <stdio.h>
int main() {
int a = 1;
int b = 2;
int sum = a + b;
printf("sum = %d\n", sum);
return 0;
}
// Makefie
GXX = g++
CC = gcc
TARGET = testadd
OBJS = testadd.o
testadd:${OBJS}
${CC } ${OBJS} -o ${TARGET} # 空格处为一个Tap
testadd.o:testadd.c
clean:
rm -r ${OBJS} ${TARGET} # 空格处为一个Tap
2) .cpp文件
// testadd.cpp
#include <stdio.h>
//#include <iostream>
int main() {
int a = 1;
int b = 2;
int sum = a + b;
printf("c sum = %d\n", sum);
//std::cout <<"c ++ sum = " << sum<<std::endl;
return 0;
}
// Makefile
GXX = g++
CC = gcc
TARGET = testadd
OBJS = testadd.o
testadd:${OBJS}
${GXX} ${OBJS} -o ${TARGET} # 空格处为一个Tap
testadd.o:testadd.cpp
clean:
rm -r ${OBJS} ${TARGET} # 空格处为一个Tap
经过以上测试,总结如下:
以.cpp为后缀的文件,为c++代码。代码最好使用C++语言。也可以使用c语言。
a 代码使用c++语言,编译时必须要用g++,不能使用gcc。
b 代码使用c语言,编译时可以使用gcc ,也可以使用g++。
以.c为后缀的文件,为c代码,代码最好使用c语言。
a 代码使用c语言,编译时可以使用g++,也可以使用gcc.
b 代码使用c++语言,编译时,不能使用gcc,也不能使用g++.
既:cpp文件可以使用c语言,c++语言编写。c文件,只能使用c语言编写。
2、 两个源文件,以.cpp文件为例
// testadd.cpp
#include "add.hpp"
int main() {
int sum = add(5,8);
std::cout <<"c ++ sum = " << sum<<std::endl;
return 0;
}
// add.cpp
#include "add.hpp"
int add(int a, int b) {
std::cout<<"a = "<<a<<std::endl;
std::cout<<"b = "<<b<<std::endl;
return a + b;
}
// add.hpp
#include <iostream>
int add(int a, int b);
// Makefile
GXX = g++
CC = gcc
TARGET = testadd
TARGET_SOURCE = testadd.cpp \
add.cpp
${TARGET}:${TARGET_SOURCE}
${GXX} -o ${TARGET} ${TARGET_SOURCE}
clean:
rm -r *.o ${TARGET}
编译指令:make。生成testadd
3、编译成动态库
源代码与实例2相同,Makefile文档如下:
GXX = g++
CC = gcc
TARGET = libadd.so
TARGET_SOURCE = add.cpp
${TARGET}:${TARGET_SOURCE}
${GXX} -shared -fPIC ${TARGET_SOURCE} -o ${TARGET}
clean:
rm -r *.o ${TARGET}
编译指令:make。生成add.so
4、使用动态库
源码与上述源码相同。Makefile文件。
// Makefile
GXX = g++
CC = gcc
TARGET = testadd
TARGET_SOURCE = testadd.cpp
LIBS = /home/lily/cproject/testMakeFile/libs # so库所在路径
${TARGET}:${TARGET_SOURCE}
${GXX} -o ${TARGET} ${TARGET_SOURCE} -L${LIBS} -ladd
clean:
rm -r *.o ${TARGET}
编译指令:make 。生成testadd.
注意:在./testadd 之前,需要添加
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/lily/cproject/testMakeFile/libs,否则报错找到库文件。
5、头文件放到include文件夹下,其他不动。Makefile
# Makefile
# Compile as C++11
#add_compile_options(-std=c++11)
# 指定编译器
CXX = g++
CC = gcc
#指定编译选项
CFLAGS = -Wall -g
TARGET = testadd
Src:=$(wildcard *.cpp)
Objs:=$(patsubst %.cpp,%.o, $(Src))
#指定头文件位置
INCLUDES = -I ./include
#指定库文件
LIBS=-L ./libs -ladd
$(TARGET):$(Objs)
echo $(Objs)
@mkdir -p output
$(CXX) $(Objs) $(LIBS) -o output/$(TARGET)
%.o:%.cpp
$(CXX) $(INCLUDES) $(CFLAGS) -c $< -o $@
clean:
rm $(Objs)