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("
"
); printhelloworld(); return 0; } void printhelloworld(void){ printf("hello world
"
); } // ./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("
it 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