0、学习的时候用Editor、Make、Compiler、Linker以及Debugger还有各种工具,了解开发细节。实战的时候用IDE加快开发速度。
除非你的项目简单到了只需要命令:compiler a.cpp就能生成a.exe。否则,请使用良好的文件组织结构:
your_project_folder\
src\
module_a\
a.cpp
ax.cpp
axx.cpp
module_b\
b.cpp
bx.cpp
bxx.cpp
bin\
lib\
library_a\
xxx.lib
yyy.lib
zzz.lib
library_b\
hhh.lib
jjj.lib
kkk.lib
include\
library_a\
iii.h
uuu.h
library_b\
ggg.h
fff.h
module_a\
a.h
ax.h
axx.h
module_b\
b.h
bx.h
bxx.h
我平时使用的Makefile可以从这里下载到,里面随便一个C++demo下载下来就有Makefile,可以参考(我不是很深入的了解Makefile,所以写的可能有些啰嗦、、不过好歹能用。。。),下面贴上我自己平时用的Makefile模板(配合Visual Studio的NMAKE程序,换到linux下其实也就是改改compiler和linker还有一些其他操作系统相关的指令就能用,差不太多)
1 # compiler 2 CC = cl 3 # linker 4 LINK = link 5 # libraries 6 LIB_ZTHREAD = /LIBPATH:E:\cppwksp\zthreaddemo_win\libs\zthread 7 LIB_SYNC_OUTPUT = /LIBPATH:E:\cppwksp\zthreaddemo_win\demo\C11\531-SynchronizedOutput\lib 8 # headers 9 HEADER_PATH = /I E:\cppwksp\zthreaddemo_win\include /I include 10 # options 11 EHSC = /EHsc 12 COMPILATION_ONLY = /c 13 C_OUT = /Fo: 14 L_OUT = /OUT: 15 # compiler & linker debug option, to disable debug, replace ‘/Zi‘ & ‘/DEBUG‘ with empty strings 16 # C_DEBUG = /Zi 17 # L_DEBUG = /DEBUG 18 C_DEBUG = 19 L_DEBUG = 20 # targets 21 22 bin\test.exe: bin lib\SynchronizedOutput_win32.lib obj\SynchronizedOutputTask.obj obj\NormalTask.obj obj\Task.obj obj\main.obj 23 $(LINK) $(L_DEBUG) $(LIB_ZTHREAD) $(LIB_SYNC_OUTPUT) $(L_OUT)bin\test.exe obj\main.obj obj\SynchronizedOutputTask.obj obj\NormalTask.obj obj\Task.obj SynchronizedOutput_win32.lib ZThread_win32.lib 24 25 lib\SynchronizedOutput_win32.lib: lib obj obj\SynchronizedOutput.obj 26 LIB $(L_OUT)lib\SynchronizedOutput_win32.lib obj\SynchronizedOutput.obj 27 28 obj\SynchronizedOutput.obj: src\SynchronizedOutput.cpp include\SynchronizedOutput.h 29 $(CC) $(C_DEBUG) $(EHSC) $(HEADER_PATH) $(COMPILATION_ONLY) src\SynchronizedOutput.cpp $(C_OUT)obj\SynchronizedOutput.obj 30 31 obj\main.obj: src\main.cpp include\SynchronizedOutputTask.h include\NormalTask.h include\Task.h 32 $(CC) $(C_DEBUG) $(EHSC) $(HEADER_PATH) $(COMPILATION_ONLY) src\main.cpp $(C_OUT)obj\main.obj 33 34 obj\SynchronizedOutputTask.obj: src\SynchronizedOutputTask.cpp include\SynchronizedOutputTask.h include\Task.h include\SynchronizedOutput.h 35 $(CC) $(C_DEBUG) $(EHSC) $(HEADER_PATH) $(COMPILATION_ONLY) src\SynchronizedOutputTask.cpp $(C_OUT)obj\SynchronizedOutputTask.obj 36 37 obj\NormalTask.obj: src\NormalTask.cpp include\NormalTask.h include\Task.h 38 $(CC) $(C_DEBUG) $(EHSC) $(HEADER_PATH) $(COMPILATION_ONLY) src\NormalTask.cpp $(C_OUT)obj\NormalTask.obj 39 40 obj\Task.obj: src\Task.cpp include\Task.h 41 $(CC) $(C_DEBUG) $(EHSC) $(HEADER_PATH) $(COMPILATION_ONLY) src\Task.cpp $(C_OUT)obj\Task.obj 42 43 # folders 44 45 bin: 46 mkdir bin 47 48 obj: 49 mkdir obj 50 51 lib: 52 mkdir lib 53 54 # clean 55 # bin, lib, obj folders and pdb files 56 57 .PHONY: clean 58 clean: 59 -rmdir /s /q bin 60 -rmdir /s /q lib 61 -rmdir /s /q obj 62 -del *.pdb
关于Makefile,我写了一篇笔记很重要,点此查看
1、头文件的#include顺序:自己写的头文件、第三方工具的头文件、标准头文件,尽量从上到下这样安排顺序
头文件一定要写上#ifndef xxx #define xxx #endif的header guard
头文件中除了template和inline以外,都只写declaration不要把implementation代码写在头文件里,免得xxx redefined错误,保持一个好的习惯
2、头文件里不要包含:using指令和using namespace指令
头文件中不要初始化static member,避免xxx redefined错误,放到cpp文件中去初始化
3、如果你有一个class,尽量为这个class建立一个单独的header文件和cpp文件,需要隐藏实现细节的时候除外
4、待补充。。。