单个源文件编译
# source object target
SOURCE := demo.cpp
OBJS := demo.o
TARGET := demo
# compile and lib parameter
CC := g++
# 用于编译时调用so
LIBS := -lLibHandsDetect -lpython3.6m
LDFLAGS := -L. \
-L/home/bob/anaconda2/envs/karas_py36/lib
DEFINES :=
INCLUDE := -I/home/bob/anaconda2/envs/karas_py36/include/python3.6m \
-I.
# 用于链接时调用so
CFLAGS := -Wl,-rpath=/home/bob/anaconda2/envs/karas_py36/lib -Wl,-rpath=.
CXXFLAGS:=
# link
# -g 加入debug信息
# $@ 代表目标文件 $< 代表第一个文件 $^ 代表所有依赖文件
$(TARGET):$(OBJS)
$(CC) -g -o $@ $^ $(LDFLAGS) $(CFLAGS) $(LIBS)
# compile
$(OBJS):$(SOURCE)
$(CC) $(INCLUDE) -c $^ -o $@
# all:
# $(CC) -o $(TARGET) $(SOURCE)
clean:
rm -fr *.o $(TARGET)
多个源文件
C++示例代码
// ./myhello.c
#include <stdio.h>
#include "test.h"
#include "abc.h"
void printhelloworld(void);
int main()
{
abc();
printtest();
printf("\n");
printhelloworld();
return 0;
}
void printhelloworld(void){
printf("hello world\n");
}
// ./common/abc.h
#include <stdio.h>
void abc(void);
// ./common/abc.c
include "abc.h"
include <stdio.h>
void main()
{
printf("helloworld");
}
// ./common/test/test.h
void printtest(void);
// ./common/test/test.c
#include <stdio.h>
void printtest(void)
{
printf("\nit is in test.c");
}
makefile 代码
#compile and lib parameter
CC := gcc
INCLUDE := -I. -Icommon/ -Icommon/test
CFLAGS := -Wall -g
# source
TARGET := myhello
SRC1 := myhello.c
SRC2 := ./common/abc.c
SRC3 := ./common/test/test.c
OBJ1 := ./obj/myhello.o
OBJ2 := ./obj/abc.o
OBJ3 := ./obj/test.o
#把源文件SRCS字符串的后缀.c改为.o
#OBJS = $(SRCS:.c=.o)
DIR_SRC1 := .
DIR_SRC2 := ./common
DIR_SRC3 := ./common/test
DIR_OBJ := ./obj
SRCS := $(wildcard ${DIR_SRC1}/*.c ${DIR_SRC2}/*.c ${DIR_SRC3}/*.c)
OBJS := $(patsubst %.c,${DIR_OBJ}/%.o, $(notdir ${SRCS}))
# link
#$(TARGET):$(OBJ1) $(OBJ2) $(OBJ3)
# $(CC) $(OBJ1) $(OBJ2) $(OBJ3) -o $(TARGET)
$(TARGET):$(OBJS)
$(CC) $(OBJS) -o $(TARGET)
# compile
$(OBJ1):$(SRC1)
$(CC) $(INCLUDE) -c $(SRC1) -o $(OBJ1)
$(OBJ2):$(SRC2)
$(CC) $(INCLUDE) -c $(SRC2) -o $(OBJ2)
$(OBJ3):$(SRC3)
$(CC) $(INCLUDE) -c $(SRC3) -o $(OBJ3)
# all:
# 调试
# @echo $(SRCS)
# @echo $(OBJS)
# $(CC) -o $(TARGET) $(SOURCE)
clean:
#find ${DIR_OBJ} -name *.o -exec rm -rf {} \;
rm -fr *.o $(TARGET)
SO文件与调用
生成so文件
# compile and lib parameter
# c++ 需要加 -std=c++11
#CC := g++
CC := gcc
INCLUDE := -I. -Icommon/ -Icommon/test
CFLAGS := -Wall -g
# source
TARGET := libtest.so
SRC3 := ./common/test/test.c
OBJ3 := ./obj/test.o
all:
$(CC) $(INCLUDE) $(CFLAGS) -fPIC -shared $(SRC3) -o $(TARGET)
clean:
find ${DIR_OBJ} -name *.o -exec rm -rf {} \;
rm -fr *.o $(LIB)
调用so文件
# compile and lib parameter
CC := gcc
CFLAGS := -Wall -g
# lib
LDFLAGS := -L.
LIBS := -ltest
INCLUDE := -I. -Icommon/test
# source
TARGET := myhello
SRC1 := myhello.c
OBJ1 := ./obj/myhello.o
# link
$(TARGET):$(OBJ1)
$(CC) $(LDFLAGS) -o $@ $^ $(LIBS)
# compile
$(OBJ1):$(SRC1)
$(CC) $(INCLUDE) $(CFLAGS) -c $^ -o $@
clean:
find ${DIR_OBJ} -name *.o -exec rm -rf {} \;
rm -fr *.o $(LIB)
GDB调试
问题:Segmentation fault (core dumped)
# 在一些Linux版本下,默认是不产生core文件的,首先可以查看一下系统core文件的大小限制
ulimit -c
# 设置一个大小。注:如果没有产生core文件,可能是ulimit设置的太小,尝试设置的大一些或者设为unlimited
ulimit -c 1024
# 运行demo,生成段错误core文件,当然前提是编译的时候加-g
./demo
# 调试错误
gdb ./demo ./core
# 使用where查看函数调用情况,使用q退出gdb
where