目前,我正在努力学习跨平台开发的最佳实践,以便在未来的项目中实现更高的生产力。我开始使用OS X和Linux上的unix终端进行基本设置。然后我在Windows上使用了Cygwin环境和MinGW GCC编译器的组合。然后通过一个通用的makefile(见下文)来管理所有内容,它将使用rsync作为链接到中央存储库的版本控制的基本形式。
我当前的项目目录结构是:
project_root
include
src
makefile
platform
win
build
resources (Media)
shaders (GLSL Shaders)
include (platform specific include)
lib (platform specific libraries)
object
mac
build
resources
shaders
include
lib
object
resources
shaders
和makefile看起来像:
PROJECT_NAME := craft
UNAME := $(shell uname)
OS_TYPE := WINDOWS
EXE := .exe
DIR := win
LDFLAG := -Wall -g -std=c++11 -mwindows -static -L../platform/$(DIR)/lib -lstdc++ -lgdi32 -lglew -lglfw3 -lopengl32
CXXINCLUDE := -I../platform/$(DIR)/include
LD := i686-w64-mingw32-gcc
CXX := i686-w64-mingw32-gcc
ifeq ($(UNAME), Darwin)
OS_TYPE := MACINTOSH
EXE :=
DIR := mac
LDFLAG := -Wall -g -std=c++11 -L../platform/$(DIR)/lib -lstdc++ -lglfw3 -framework Cocoa -framework OpenGL -framework IOKit -framework CoreVideo
CXXINCLUDE := -I../platform/$(DIR)/include
LD := clang
CXX := clang
endif
CXXFLAG := -Wall -g -I../include
CU := nvcc
CPP_FILES := $(wildcard *.cpp)
OBJ_FILES := $(CPP_FILES:.cpp=.o)
all: build
build: $(OBJ_FILES)
$(LD) -o ../platform/$(DIR)/build/$@$(EXE) $(addprefix ../platform/$(DIR)/object/, $^) $(LDFLAG)
%.o: %.cpp
$(CXX) -o ../platform/$(DIR)/object/$@ -c $< $(CXXFLAG) $(CXXINCLUDE)
platform:
echo $(OS_TYPE)
clean: clobject
rm -rf ../platform/$(DIR)/build/build$(EXE)
clobject:
rm -rf ../platform/$(DIR)/object/*.o
resources:
rsync -va --delete ../resources ../platform/$(DIR)/build/
shaders:
rsync -va --delete ../shaders ../platform/$(DIR)/build/
run:
../platform/$(DIR)/build/build$(EXE)
send:
rsync -va --delete $(DEV)/$(PROJECT_NAME) $(DEV_MASTER)
get:
rsync -va --delete $(DEV_MASTER)/$(PROJECT_NAME) $(DEV)
这适用于任何基本项目,但确实有问题,我想在Windows中使用MSVC而不是GCC。我真的很感激有关环境设置和工作流程/工具的建议吗?
我希望:
这在使用基于* nix的系统时非常简单,但是使用Windows,我可以使用Git Bash而不使用Visual Studio命令提示符来运行使用cl.exe的makefile / ninja吗?或者只使用.vcprog会更好吗?
答案 0 :(得分:1)
是的,这是非常可行的,实际上非常直接。
基本的cmake示例应涵盖您想要的所有内容。
关于构建文件夹的说明: 那些不应该是你的源代码树的一部分。相反,您应该将源树中某个位置的所有资源文件复制到构建文件夹中。