C++调用python训练的pytorch模型(一)--makefile编写基础

单个源文件编译

# 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)

多个源文件

参考:多个文件目录下Makefile的写法

C++示例代码

c++文件参考

// ./myhello.c
#include 
#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 
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 
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

你可能感兴趣的:(机器学习,C/C++,linux)