快速启动 C/C++ 项目






3.50/5 (5投票s)
跳过“从头开始”和 Makefile 的废话,这将激发您的创造力
引言
PEP 是一个小的 C++ 跨平台框架生成器,可以为您的 C++ 工作流程提供一些速度!
它将输出一些基本的类,您就可以开始了!
对于你们中的一些程序员来说,这篇文章可能很有趣。
警告:我是荷兰人,所以请享受本文中的语言 :)
场景
您还记得那些“嘿,让我们为这个想法编写一个小的非 IDE C/C++ 程序”的感觉吗?
这些感觉不是很美妙吗?:)
好的,所以您打开您最喜欢的 Drum'N'Bass CD(或您喜欢的音乐),然后您充满热情地开始。
但是很快,这些感觉就被编写跨平台 Makefile、单例、目录、配置……而不是编写真正的代码而破坏了!:(
自从我厌倦了这些“扼杀创造力的任务”之后,我开始编写这个,所以现在我们可以立即开始编码我们的想法了!
这一切都归结为这个小的 shell 脚本命令:
kn0r pep # ./pep
Usage: pep <project name> <target directory>
要求
只需要一个编译器、安装的 svn 和一个 Unix 环境即可。
(在 GNU gcc/DevCpp/Mingw32/Cygwin 编译器上测试过)
特点
- shellscript:PEP shell 脚本会自动将 PEP 框架的所有类重命名为您的项目名称
- .ini 解析器:轻松读取/写入.ini文件并在应用程序中使用
- 框架:您将获得一个带有单例的基本工作跨平台骨架来启动
- 断言:在运行时,您可以使用 '
_assert()
' 函数更轻松地找到错误 - outputclass:使用 '
_()
' & '_say()
' 函数轻松调试变量,也会记录到 'log.txt' - memoryleaks:释放内存泄漏!(开玩笑)如果启用 compilerflag -DDEBUG 标志,您将获得关于您的应用程序内存泄漏的有用信息
- Makefile 不同平台的模板(也有一个
DevCpp
项目文件)
使用方法
好的,获取 zip 文件,让我们在 Linux 提示符下执行以下操作
kn0r pep # ./pep myproject myproject
[x] creating directory
[x] getting hottest source in town!
A myproject
A myproject/COMPILING
A myproject/src
A myproject/src/pep
A myproject/src/pep/ini.cpp
A myproject/src/pep/output.cpp
A myproject/src/pep/ini.h
A myproject/src/pep/pep.cpp
A myproject/src/pep/global.h
A myproject/src/pep/output.h
A myproject/src/pep/pep.h
A myproject/src/main.cpp
A myproject/src/debug.cpp
A myproject/bin
A myproject/bin/pep.ini
A myproject/bin/data
A myproject/obj
A myproject/prj
A myproject/prj/Makefile.dreamcast
A myproject/prj/pep-DevCpp.dev
A myproject/prj/configure
A myproject/prj/configure.ac
A myproject/prj/Makefile.inc
A myproject/prj/Makefile.macosx
A myproject/prj/Makefile.windows
A myproject/prj/Makefile.linux
A myproject/README
Exported revision 7.
[x] Unzipping module.
[x] Preparing files 'myproject'
[x] Preparing files 'myproject'
[x] Preparing files 'myproject'
[x] Preparing files 'myproject'
[x] Preparing files 'myproject'
[x] Preparing files 'myproject'
[x] Preparing files 'myproject'
[x] install completed.
好的……您可能在想“那是什么?”
好吧,非常简单,源文件被提取,文件被重命名为“myproject”。
让我们看看我们刚刚创建的目录“myproject”
|-- INSTALL <- documentation about how to compile
|-- README <- this document
|-- bin <- the binaries will be put here
| |-- data <- a directory where application files can be located
| |-- [log.txt] <- debug information will be stored here
| |-- [myproject] <- linux binary
| |-- [myproject.bin] <- dreamcast binary
| `-- [myproject.exe] <- windows binary
|-- obj <- here the .o files are stored
|-- prj
| |-- Makefile.dreamcast
| |-- Makefile.inc <- here the .cpp can be specified for the
GNU style compilers
| |-- Makefile.linux
| |-- Makefile.macosx
| |-- Makefile.windows
| |-- configure
| |-- configure.ac <- starting point for autotools
| `-- myproject-DevCpp.dev <- devcpp project file
`-- src
|-- debug.cpp <- here the memory leak checking is done
|-- main.cpp
`-- myproject
|-- global.h
|-- output.cpp <- class for logging and outputting variables
|-- output.h
|-- ini.h <- class for read/writing ini files
|-- ini.cpp
|-- myproject.cpp
`-- myproject.h <- the 'core' engine, a basic singleton
btw. files between the [ ] are generated after the first compile
现在……让我们看看我们的main
函数
int main(){
string str;
int done = 1;
myproject *p = myproject::get();
_say( "Welcome to '%s'", p->config->GetValue( "settings", "appname" ).c_str() );
_( TRACE("outputting some debug info%i"), done );
_( ERROR("triggering an error! %i"), done );
_( WARNING("triggering a warning %i"), done );
_( FATAL("triggering some fatal error %a, immediate exit!"), done );
_assert( p != 0, "p must not be null" );
_assert( p == 0, "p must be null" );
p->config->SetValueI( "settings", "somesetting", 1234 );
p->config->WriteFile();
delete p;
_say("all done", 0);
return 1;
}
基本上发生的是:首先创建 myproject-engine 对象(通过单例),然后我们将一些数据发送到我们的 outputclass。之后我们做一些断言,这是方便的开发者工具。最后,我们将一些东西写入.ini文件并进行清理。
您一定在想……_( ) 函数是怎么回事?好吧,我们这样做是为了显示额外的调试信息。只需查看此输出
kn0r myproject # cd prj/
kn0r prj # make -f Makefile.linux all
c++ -DDEBUG -DLOG -c ../src/main.cpp -o ../obj/main.o -DDEBUG -DLOG
c++ -DDEBUG -DLOG -c ../src/myproject/output.cpp -o ../obj/output.o -DDEBUG -DLOG
c++ -DDEBUG -DLOG -c ../src/myproject/myproject.cpp -o ../obj/myproject.o -DDEBUG -DLOG
c++ -DDEBUG -DLOG -c ../src/myproject/ini.cpp -o ../obj/ini.o -DDEBUG -DLOG
c++ -DDEBUG -DLOG -o ../bin/myproject
../obj/main.o ../obj/output.o ../obj/myproject.o ../obj/ini.o -lm
kn0r prj # cd ../bin
kn0r bin # ./myproject
myproject> Welcome to 'myApplication v1.0'
myproject> [TRACE@../src/main.cpp:30] outputting some debug info1
myproject> [ERROR@../src/main.cpp:31] triggering an error! 1
myproject> [WARNING@../src/main.cpp:32] triggering a warning 1
myproject> [FATAL@../src/main.cpp:33] triggering
some fatal error 0x0.0000000000001p-1022, immediate exit!
myproject> [ASSERTION@../src/main.cpp:36] p must be null
myproject> delete myproject!
myproject> all done
0xb7f40e54
*** WARNING: GCC 3 or later is detected
delete: freed 0x8058048 (size 893, 0 bytes still allocated)
背景
每次我开始一个针对不同平台的项目时,我发现自己一次又一次地编写相同的“从头开始”的东西。
在许多情况下,远离大型 GUI IDE 是明智的。
我发现,当我开始使用命令行 GCC 进行开发时,移植到 Windows 比反过来更容易。
但是……命令行的东西有其缺点……编写 Makefile 非常费力,即使使用 Makefile 生成器也是如此。
我厌倦了一遍又一遍地编写相同的东西……所以我决定编写这个基本的框架生成器,以保持它的简单。
鸣谢
- Tim Gerritsen (gloomy)
- Leon van Kammen (sqz)
- IZI-Services
- 感谢 Wu Yongwei 的精彩“nvwa”C++ 实用程序
- Adam Clauss & Shane Hill - 感谢他们出色的跨平台 ini 文件读取器/写入器
历史
- [20-11-2008] v1.0 第一个草图
- [23-04-2009] v1.1 添加了 inifile 并修复了小错误