Tôi không thể tìm thấy một cách để sử dụng một makefile phổ biến để làm việc cho cả hai GNU thực hiện và MS nmake, chủ yếu là vì chúng có cú pháp không tương thích với các chỉ thị "bao gồm" và/hoặc "nếu". MS nmake yêu cầu phải sử dụng! tiền tố cho chỉ thị. ví dụ,! if,! include, etc ...
Nếu nó được phép có các macro riêng biệt, tuy nhiên, nó có thể bị lừa xung quanh. Ở đây tôi trình bày cách tốt nhất tôi đã tìm thấy cho đến nay để làm cho makefile tương thích cho cả GNU và MS nmake bằng cách quan sát những điều sau:
- MS nmake đọc TOOLS.ini tệp cho macro mặc định.
- MS suite sử dụng .obj làm phần mở rộng tệp đối tượng.
- GNU tạo tệp đọc được xác định trong biến môi trường MAKEFILES.
- Sử dụng bộ phần mềm GNU làm phần mở rộng tệp đối tượng.
- GNU không cần cung cấp phần mở rộng thực thi .exe cho mục tiêu.
Lưu ý: Phần sau đã được kiểm tra bằng MS Visual Studio 2015 và MINGW32.
Bước 1: tạo tệp lô DOS sau và cho phép nó chạy bất cứ khi nào lời nhắc CMD được gọi.
set MAKEFILES=TOOLS.gcc
call "C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\vcvarsall.bat"
Bước 2: Tạo một file TOOLS.ini dưới thư mục làm việc của bạn như sau: (file này không phụ thuộc vào phụ thuộc dự án của bạn ngoại trừ các thư viện có thể)
[NMAKE]
LDLIBS =
CDEBUG = /Zi
LDEBUG = /debug:full
WDFLAGS = /wd4996 /wd4774 /wd4018 /wd4710 /wd4820
CFLAGS = /nologo $(CDEBUG) /EHsc /Wall $(WDFLAGS)
LDFLAGS = /nologo $(LDEBUG)
RM = del /F /Q
LINK = "$(VCINSTALLDIR)bin\link" $(LDFLAGS)
CP = copy
CC = cl
CPP = $(CC) /P
X = .exe
O = .obj
.obj.exe:
$(LINK) $** $(LOADLIBES) $(LDLIBS) /Out:[email protected]
Bước 3: Tạo một CÔNG CỤ .gcc dưới thư mục làm việc của bạn như sau: (file này không phụ thuộc vào phụ thuộc dự án của bạn ngoại trừ các thư viện có thể)
LD_LIBS =
LDLIBS =
CDEBUG = -g
LDEBUG = -g
CFLAGS = $(CDEBUG)
LDFLAGS = $(LDEBUG)
RM = rm -f
LINK = gcc $(LDFLAGS)
CP = cp
CC = gcc
CPP = $(CC) -E
X =
O = .o
%: %.o
$(LINK) $^ $(LOADLIBES) $(LDLIBS) -o [email protected]
Bước 4: chỉnh sửa makefile của bạn như sau (lưu ý $ (X) và $ (O)) trong đó chỉ phụ thuộc được xác định.
SHELL = /usr/bin/sh
app: app1$(X) app2$(X)
app1$(X): app1$(O)
app2$(X): app2$(O)
clean:
$(RM) *.exe *.o *.obj *.ilk *.pdb *.tmp *.i *~
Bước 5: Thưởng thức GNU thực hiện và MS nmake với cùng makefile
$ nmake
$ make clean
$ nmake clean
$ make
Bạn có thể xây dựng hoặc nhận GNU thực hiện trên hệ thống Windows của bạn. –
Đối với các dự án nền tảng chéo, tôi có thể giới thiệu cmake (http://www.cmake.org). –
Tôi đã đọc về cmake. Nhưng tôi cần điều đó cho một bài tập ở trường đại học nơi mà chúng ta phải sử dụng nmake. – j0ker