1.ifndef等的用法
http://baike.sogou.com/v7669863.htm?fromTitle=%23ifndef
2.CMake 的较完整演示
http://www.hahack.com/codes/cmake/
3.需要掌握的CMake制作
http://blog.csdn.net/weicao1990/article/details/72844995
http://www.linuxidc.com/Linux/2014-03/98622.htm(最有用链接hy:cmake设置交叉编译环境)
实例如下:
1. 建立如下目录
2. Src中包含
3. 分别执行以下命令,得到相应源文件及src中的CMakeLists.txt
main.cpp
Lib_demo.cpp
CMakeLists.txt
4. 根目录下的CMakeLists.txt
5. include目录下文件如下
main.h
lib_demo.h
6. 接下来在build文件中执行cmake.. ,若编译通过,再执行make,这样在bin下生成了可执行文件,就是我们在src中的CMakeLists.txt申明的Demo,在bin目录下./Demo,就可以输出内容
注:1. lib下存放生成的库(静态库和动态库),此实例下为空
2. build目录下会生成一些新文件
补充:
若在src目录下的CMakeLists.txt加入静态库和动态库,则在lib中会出现相应的库文件
Kdevelop的学习
Cmake更深入的例子:
MP3播放功能:
1.MP3文件中目录如下:
其中具体内容如下:
在src中存放源文件,include中存放头文件,bin下存放可执行文件,build下执行cmake..和make命令。
注意:
1. List_and_play.c是最基层文件,这里称为一级文件,在main.c和play.c中都会用到List_and_play.c中的函数或者变量;play.c是二级文件,在main.c中会用到play.c中的函数; main.c是三级文件,调用List_and_play.c 和play.c中的函数及变量;
2.头文件.h文件中一般存放一些结构(如struct结构和class等)和源文件的函数体声明,一般不存放变量,否则变量一旦被修改,在源文件的使用则会受到影响;
3.一个源文件除了需调用本源文件的头文件外,当用到其他源文件时,需调用其他源文件的函数体,这里故调用其他源文件的头文件;
4.一般不声明全局变量,若声明了,一般在main.c中进行全局声明,在具体函数中用到的时候,需采用extern关键字对其再次申明,如extern int a;
5.函数中的标准头文件一般只写在本函数中用到的;
源文件 list_and_play.c , play.c和main.c, 的一部分代码依次如下:
List_and_play.c : 这里有两个函数,开始播放函数和播放函数
Play.c函数:这里有暂停函数,停止函数,继续函数,上一首函数,下一首函数
Main.c函数如下:用来调用开始播放函数,播放函数,暂停函数,停止函数,继续函数等
Src下的CMakeLists.txt如下:
第一行:查找当前目录下的所有源文件,并将名称保存到DIR_SRCS目录;
第二行:指定头文件目录,并且指明头文件存放在include下;
第三行:指定可执行文件的输出目录,输出到bin下;
第四行:生成目标函数MP3song。
接下来,看include下的文件:
MP3下的CMakeLists.txt如下
综上,在bin文件下就会生成MP3的可执行文件MP3Song。
MP3例子详解:
为什么不用子进程直接播放,当时我也在思考这个问题,但是当我修改这个程序本身的BUG后,我明白了。我想是因为如果使用子进行调用execl族函数进行播放了,execl族函数的特点是删除本身进程的函数,执行execl的函数,那么父进程必然要使用wait函数等待子进程,执行完成后,切换到下一首歌曲,那么父进程又怎么去检测按键嗯?
播放标识play_ flag
只有当play_ flag=1 时,才可以执行暂停函数实现暂停功能;
当play_ flag=0 时,才可以执行暂停函数实现继续播放功能;
First_ key = 1表示是首次播放
Play.c中的上一首和下一首函数中,为什么需要杀死两个进程,即子进程和孙子进程?
答:子进程是播放函数的调用,孙子进程是播放函数的具体实现.
Wait(NULL)是等待子进程和孙子进程结束,再调用下面的播放上一首或下一首函数
创建共享内存时,映射使得将创建的共享内存映射到具体的地址空间中。