这是我设置的目录结构:
Matrix
│ Makefile
│
├───bin
├───include
│ matrix.h
│
├───lib
├───obj
├───rc
│ matrix.rc
│
└───src
matrix.c
matrix_mem.c
这里是Makefile:
# This Makefile will build the Matrix Library.
TOOLCHAIN := C:\MinGW
SRCTREE := C:\Users\admin\Desktop\Matrix\Matrix
CC := $(TOOLCHAIN)\bin\gcc.exe
AR := $(TOOLCHAIN)\bin\ar.exe
WINDRES := $(TOOLCHAIN)\bin\windres.exe
SRCDIR := $(SRCTREE)\SRC
OUTDIR := $(SRCTREE)\BIN
OBJDIR := $(SRCTREE)\OBJ
RESDIR := $(SRCTREE)\RC
LIBDIR := $(SRCTREE)\LIB
INCDIR := $(SRCTREE)\INCLUDE
CFLAGS := -O3 -std=gnu89 -Wall
CFLAGS_EXTRA :=
OBJS := $(shell find $(OBJDIR) -name '*.o')
DEPS := $(OBJS:.o=.d)
-include $(DEPS)
all: dll
dll: CFLAGS_EXTRA := -DMATRIX_USE_DLL -DDLL_EXPORTS
dll: matrix.dll
static: CFLAGS_EXTRA :=
static: matrix.lib
matrix.dll: matrix_mem.o matrix.o resource.o
matrix.lib: matrix_mem.o matrix.o
%.o: $(SRCDIR)\%.c
$(CC) $(CFLAGS) -I $(INCDIR) $(CFLAGS_EXTRA) -MM -MT $(OBJDIR)\$@ -MF $(patsubst %.o,%.d,$(OBJDIR)\$@) $<
$(CC) -c $(CFLAGS) -I $(INCDIR) $(CFLAGS_EXTRA) -o $(OBJDIR)\$@ $<
@echo ...$(OBJS)...
%.dll:
$(CC) -shared -s -o $(OUTDIR)\$@ $(patsubst %,$(OBJDIR)\\%,$^) -Wl,--subsystem,windows,--output-def,$(OUTDIR)\$*.def,--out-implib,$(OUTDIR)\$*.lib
%.lib:
$(AR) -ru $(OUTDIR)\$@ $(patsubst %,$(OBJDIR)\\%,$^)
resource.o: $(RESDIR)\matrix.rc
$(WINDRES) -i $< -o $(OBJDIR)\$@
clean::
-rm $(OBJDIR)\matrix.o
-rm $(OBJDIR)\matrix_mem.o
-rm $(OBJDIR)\matrix.d
-rm $(OBJDIR)\matrix_mem.d
-rm $(OBJDIR)\resource.o
-rm $(OUTDIR)\matrix.def
-rm $(OUTDIR)\matrix.lib
-rm $(OUTDIR)\matrix.dll
Makefile
在MinGW
和Cygwin
下正常工作。
我仍然难以让include依赖工作。
似乎没有包含.d
个文件。由于代码在GCC
个变种中编译得很好,我想尝试在Linux
上编译它。我想对Makefile
进行最少的更改。
我知道我必须更改路径样式和其他编译选项。
但是,截至此处,如何正确处理包含依赖关系的make
,而不需要与shell进行多少交织?我使用make 3.80
版本。
这是一个最小的源实现:
matrix.h:
/*----------------------------- matrix.h ------------------------------*/
#ifndef __MATRIX_H_INCLUDED__
#define __MATRIX_H_INCLUDED__
#ifdef _WIN32
#ifdef MATRIX_USE_DLL
#ifdef DLL_EXPORTS
#define MATRIX_API __declspec(dllexport)
#else
#define MATRIX_API __declspec(dllimport)
#endif
#else
#define MATRIX_API
#endif
#define MATRIX_CALL __stdcall
#else
#define MATRIX_API
#define MATRIX_CALL
#endif
#ifdef __cplusplus
extern "C" {
#endif
typedef struct _Matrix {
double **data;
int m;
int n;
} Matrix;
MATRIX_API void MATRIX_CALL dummy_func2();
MATRIX_API void MATRIX_CALL dummy_func2();
#ifdef __cplusplus
}
#endif
#endif
/*---------------------------------------------------------------------*/
matrix.c:
/*----------------------------- matrix.c ------------------------------*/
#include "matrix.h"
MATRIX_API void MATRIX_CALL dummy_func1() {
return;
}
/*---------------------------------------------------------------------*/
matrix_mem.c:
/*--------------------------- matrix_mem.c ----------------------------*/
#include "matrix.h"
MATRIX_API void MATRIX_CALL dummy_func2() {
return;
}
/*---------------------------------------------------------------------*/