CMake学习笔记

CMake基本语法规则:
1,变量引用:使用${varname}方式取值,但是在 IF 控制语句中直接使用变量名;C中也可以引用相关的变量
2,指令格式为:指令(参数1 参数2 ...),参数之间使用空格或分号分开。
3,指令大小写无关,参数和变量大小写相关。推荐全部使用大写指令。
4,字符串可以不用" ",但如果中间需要空格则一定要用
5,源文件的后缀可以省略,系统会自动寻找添加后缀

cmake_minimum_required (VERSION 2.6)
定义至少需要的Cmake版本号

PROJECT(projectname [CXX]|[C]|[Java])
定义项目名称,可以指定支持的语言。
同时定义了PROJECT_BINARY_DIR、PROJECT_SOURCE_DIR,前者指向编译文件存放的目录,后者指向项目所在目录

set (VAR [VALUE] [CACHE TYPE DOCSTRING [FORCE]])
定义变量

SET(EXECUTABLE_OUTPUT_PATH PATH)
SET(LIBRARY_OUTPUT_PATH PATH)
改变最终目标的存放位置,优先于ADD_SUBDIRECTORY定义的输出目录,可以随时改变ADD_EXECUTABLE、ADD_LIBRARY的存放地

MESSAGE([SEND_ERROR | STATUS | FATAL_ERROR] "message to display" ...)
用于向终端输出信息:
SEND_ERROR,产生错误,生成过程被跳过;
STATUS,输出前缀为-的信息;
FATAL_ERROR,同时终止cmake

常用系统变量
${CMAKE_ROOT}
${CMAKE_BINARY_DIR}
${CMAKE_SOURCE_DIR}
${CMAKE_CURRENT_BINARY_DIR}
${CMAKE_CURRENT_SOURCE_DIR}
CMAKE_INSTALL_PREFIX

add_executable(exename srcfile1 srcfile2 ... srcfileN)
定义生成可执行文件的组成文件。

add_library(libname [SHARED|STATIC|MODULE] [EXCLUDE_FROM_ALL]
source1 source2 ... sourceN)
生成库文件。libname不需要写全名,例如库文件libhello.so,只需要写hello即可。
类型有三种:SHARED,动态库;STATIC,静态库;MODULE,在使用dyld的系统有效,如果不支持dyld,则被当作SHARED对待。
EXCLUDE_FROM_ALL 指库不会被默认构建,除非有其他的组件依赖或者手工构建。

target_link_libraries (target library1 library2 ... libraryN)
为target添加需要链接的共享库,target可以是可执行文件,也可以是库

SET_TARGET_PROPERTIES(target1 target2 ...
PROPERTIES prop1 value1
prop2 value2 ...)
GET_TARGET_PROPERTY(VAR target property)
设置目标的属性名字和取值,属性有
OUTPUT_NAME为输出名字,
OUTPUT_VALUE为取值,
CLEAN_DIRECT_OUTPUT,1时不清理
VERSION, 版本号
SOVERSION, API版本

configure_file (
"${PROJECT_SOURCE_DIR}/TutorialConfig.h.in"
"${PROJECT_BINARY_DIR}/TutorialConfig.h"
)
生成配置文件,用var1生成var2

include_directories(directory1 directory2 ... directoryN)
增加头文件的搜索路径

add_subdirectory (source_dir [binary_dir] [EXCLUDE_FROM_ALL])
增加需要处理的子目录,binary_dir可以指定生成目标的存放位置,这个路径下应该有一个cMakeLists.txt
最后的参数指将此目录从编译过程排除,需要最后单独构建。

ADD_DEPENDENCIES(target-name depend-target1 depend-target2 ...)
定义target依赖的其他target,确保在编译本target之前,其他的target已经被构建。

option (USE_MYMATH
"Use tutorial provided math implementation" ON)
在CmakeGUI上增加一个USE_MYMATH的选项,默认值为ON,也等同于定义了一个变量

if (USE_MYMATH)
include_directories ("${PROJECT_SOURCE_DIR}/MathFunctions")
add_subdirectory (MathFunctions)
set (EXTRA_LIBS ${EXTRA_LIBS} MathFunctions)
endif (USE_MYMATH)

INSTALL(TARGETS targets1 ...
[[ARCHIVE|LIBRARY|RUNTIME]
[DESTINATION ]
[PERMISSIONS permissions...]
[CONFIGURATIONS
[Debug|Release|...]]
[COMPONENT ]
[OPTIONAL]
] [...])
用于安装TARGETS到DESTINATION目录下。
目标文件targets可以是三种类型:RUNTIME可执行二进制、LIBRARY动态库、ARCHIVE静态库。
DESTINATION 定义安装路径,使用相对路径则由CMAKE_INSTALL_PREFIX指定,使用绝对路径则CMAKE_INSTALL_PREFIX无效。

INSTALL(FILES files... DESTINATION
[PERMISSIONS permissions...]
[CONFIGURATIONS [Debug|Release|...]]
[COMPONENT ]
[RENAME ] [OPTIONAL])
FILES表明用于安装普通文件,files文件名是此指令所在路径下的相对路径。
如果不定义 PERMISSIONS,安装后的权限为OWNER_WRITE,OWNER_READ,GROUP_READ和 WORLD_READ

INSTALL(PROGRAMS files... DESTINATION
[PERMISSIONS permissions...]
[CONFIGURATIONS [Debug|Release|...]]
[COMPONENT ]
[RENAME ] [OPTIONAL])
非目标文件的可执行程序安装(如脚本):同FILES使用,但安装后权限默认为:
OWNER_EXECUTE, GROUP_EXECUTE, 和 WORLD_EXECUTE

INSTALL(DIRECTORY dirs... DESTINATION
[FILE_PERMISSIONS permissions...]
[DIRECTORY_PERMISSIONS permissions...]
[USE_SOURCE_PERMISSIONS]
[CONFIGURATIONS [Debug|Release|...]]
[COMPONENT ]
[[PATTERN | REGEX ]
[EXCLUDE] [PERMISSIONS permissions...]] [...])
目录安装,DIRECTORY 指所在 Source 目录的相对路径,但务必注意:如果目录名不以/结尾,那么这个目录将被安装为目标路径下的 abc;如果目录名以/结尾,
代表将这个目录中的内容安装到目标路径,但不包括这个目录本身。
PATTERN 用于使用正则表达式进行过滤,PERMISSIONS 用于指定 PATTERN 过滤后的文件权限。

add_test (TutorialRuns Tutorial 25)
does the application run?

add_test (TutorialComp25 Tutorial 25)
set_tests_properties (TutorialComp25
PROPERTIES PASS_REGULAR_EXPRESSION "25 is 5")
does it sqrt of 25,可以测试输出的语句

macro (do_test arg result)
add_test (TutorialComp${arg} Tutorial ${arg})
set_tests_properties (TutorialComp${arg}
PROPERTIES PASS_REGULAR_EXPRESSION ${result})
endmacro (do_test)
do_test (25 "25 is 5")
宏,define a macro to simplify adding tests, then use it

CheckFuntionExists.cmake检查系统是否存在某个函数
include (CheckFunctionExists.cmake)
check_function_exists (log HAVE_LOG)
函数名为log,结果在HAVE_LOG中,
用生成.h文件的办法定义HAVE_LOG,如果有log函数,则定义HAVE_LOG
#cmakedefine HAVE_LOG

# add the command to generate the source code
add_custom_command (
OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/Table.h
COMMAND MakeTable ${CMAKE_CURRENT_BINARY_DIR}/Table.h
DEPENDS MakeTable
)

维修音响系统

近期家里的音箱经常开机时出现保护关机现象,需要开机多次才能正常工作。前天周五清洁,搬动了音箱,拉了一下音箱线,结果这路音箱不响了。于是想动手维修。
1、考虑到是功放保护,怀疑是否功放内部积灰。昨天把功放拆开了,确实有灰,但用吸尘器吸了一下,收效不大,要清理估计得将各块板都拆下来。
2、考虑到一个音箱有声,一个没声,没声的似乎低音部分有一点点声音。于是拆音箱,把不响的喇叭拆了一下,用万用表欧姆档量,能动,没有问题。拆分频器,觉得出问题的可能性小。回装,感觉应该是原装的,喇叭和电路板上都有标记。拆音箱时发现,不响的音箱线接错了,四根线中有一对+-接错了,应该就是音箱保护的原因了,至于时好时坏,是因为以下发现的接触问题,接触好时,相当于输出短路,于是功放保护了。
3、今天上午,用机械万用表的交流档量功放的输出,左右声道均量不到输出信号。无意间把左音箱线和右音箱线对换了一下,结果不响的那个喇叭也好了。终于定位是音箱接线柱生锈接触不良的问题,用WD-40处理了一下,问题解决了。
4、顺便把环绕的接线也用WD-40处理了一下,生锈的厉害,而且四个柱也没有完全拧紧。原来播放经常有时好时坏的现象。处理完消失。

心得:音箱线连接到音箱使用香蕉插头插到中心孔,接触会更好;用Y型插头需要解决生锈后的接触问题。
我的功放是雅马哈2095,音箱是KEF Q65 + KEF Q15 + KEF Q95C。现在是消除了故障隐患,其实就是输出短路的问题。2013/11/17

PN532开发板心得

1、SCRTester 使用心得。可以编辑命令,直接写内容,不需要管协议。比如激活PN532,全部的命令是
00 00 ff 03 fd d4 14 01 17 00
编辑命令只需要写入 14 01就可以。

2、UART连接要把TX接RX,rx接tx,

02款老POLO手动1.4大保养

一、基本大保养项目:机油+三滤
1、机油滤:大众德国原厂机滤约45元,上海生产的马勒MAHLE为20-25元左右,非常值得推荐。
2、汽油滤:可以采用马勒MAHLE的产品,意大利索菲玛SOFIMA也是许多车主除原厂之外的首选品牌,索菲玛 S1832B 大众波罗斯柯达晶锐1.4汽油滤清器。

3、空气滤:索菲玛SOFIMA和其它一线副厂品牌也有相关的配套产品。索菲玛 S0606A 大众波罗1.4(06年6月前)空气滤清器.

4、机油:5W-40全合成机油,不烧机油5W-30,烧机油5W-40,还烧机油5w-50。
二、火花塞 6万公里
POLO 1.4手动档型号:NGK BKUR6ET-10,价格在55-65元/只
三、正时皮带:两条皮带、两组涨紧轮、两个导向轮、一个螺栓和一个水泵共八件套。
原车的皮带由德国马牌代工,而其余所有套件也均为德国原产。德国INA和美国DAYCO的产品也可以酌情选购,产地英国的INA涨紧轮和凸轮轴皮带,产地为美国的DAYCO主正时皮带。
四、变速箱油
变速箱油采用传统的重力换油法大致需要4瓶变速箱油,缺点是无法将变速箱中的残留机油完全放出,而使用特殊换油工具进行彻底更换则大约需要12瓶变速箱油。大部分4S店使用的为重力换油法。
五、前悬挂下摆臂胶套
几乎所有的老POLO再经过6万公里之后都会不同程度的产生底盘异响,一过减速坎或者刹车就会出现“咯吱……咯吱……”的声音,原因就在于前悬挂下摆臂胶套的设计存在缺陷,“<”型二轴结构在长时间颠簸后会很快因老化而发生断裂。许多POLO老车主选择一汽大众速腾车型上使用的“×”型四轴胶套进行更换,能有效解决之前原车胶套易折损的问题,价格在50元左右。如进行更换后发生严重的跑偏现象,建议及时前去重做四轮定位。

PVC地胶板的铺装方法

购买了2mm厚的PVC地胶板,规格是914.4mmX152.4mm,价格29元/平方米。配相应的胶水,水性树胶。经过铺装,总结如下:
1、地要平,特别是墙角的石子要处理掉,这样铺装会简单很多,效果也好。
2、胶板的背面有箭头,最好安排铺下后箭头朝同一方向。长边最好向着窗户,减少因接缝不平造成的阴影。
3、铺的时候从重要的一边墙开始,保证用完整的板,不用切割。如果房子墙不垂直,要找好水平和垂直的十字线。我是在现有的瓷砖上铺,就先从从墙根摆出三条胶板,找平后从第四条开始贴。
4、地面涂胶,将胶倒在地上,,用刮刀将胶均匀涂在地面上,大概1mm厚的胶最好了。涂大约可以操作的60cm宽的一条,等到胶从白色变成透明就可以开始铺,时间长也没有大的关系,1天后粘性依旧。
5、先贴第四条,第一条用完整的胶板开始,第二条用半条胶板。胶板的切割最好用切照片的切纸刀,可以切的很直。切的时候背面朝上,我的刀不锋利,就先切一半长,再倒过来切另一半。
6、拼的时候最好互相不留缝。反复到最后全部铺完。

关于LED的一些比较

一、LED灯带,60颗/m。接头10元/个。
如果采用 3528在6000K时,每颗大约7lm,电流20mA,电压3V左右,110lm/W,显色系数约75。60个的流明数约420lm/米,功耗是3.6W。10元/m。
如果采用 5050,在6000K时,每颗大约18lm,电流60mA,电压3V左右,100lm/W,显色系数约75。60个的流明数约1000lm/米,功耗是12W。23元/m。
二、比较philips灯管:MASTER TL5 高效率,直径16mm,显色系数85
35W:98lm/W,3400lm,长度1450mm,2300lm/米
28W:97lm/W,2700lm,长度1150mm,2300lm/米
三、白炽灯的发光
约15lm/W,色温为2700K,暖白。
可见LED的发光效率与philips基本相当。另外,由于LED灯带5050亮度只有T5的40%,用于主光源略有不足。
客厅槽位 4.2 X 4.2
主房 次房 3.2
童房 2.5
From:Philips,看来节能灯的数据比LED还要节能,综合LM/W:灯管84,紧凑型63,LED约66。
1、MASTER TL5 高效率,直径16mm,显色系数85。28W:97lm/W,2700lm,长度
1150mm,2300lm/米,做成灯具+4W

2、Philips Tornado 螺旋灯,12 瓦, E27, 冷日光色,685lm/12W,价格17

11瓦,700lm,价格18。

3、Philips LED 9瓦,显色指数 (CRI): 70,色温: 6500 K(冷日光色),功率系数: 0.6,600 流明。 8W,600LM,价格69;5W,330LM,价格48

制作Kala OK文件的方法

买了一个高清播放器,可以利用其来唱kala OK,从选曲方便的角度出发,要将每首歌都分离出来作为一个文件,名字按[歌名]-[歌手]命名,以便选曲;每首歌的音轨第1轨是Kala OK,第2轨是原唱。

一、kala OK的歌曲来源于DVD碟的方法:目前找不到一步到位的切割软件,切割出来的都是只有一个音轨,所以方法比较繁琐。
1、用MKV软件将多个VOB文件合并为两个mkv文件,一个是伴奏音轨和图画,另一个是原唱音轨和图画。
2、用solveigMMVideoSplitter分别将伴奏和原唱切割为每首歌一个文件,再将每首歌的两个文件合成为一个文件,第1轨是伴奏,第2轨是原唱。选solveigMMVideoSplitter的理由是可以无损、按关键帧搜索,比较方便。

先锋MAA-350加入无线话筒接收器

周日双十一在家里改我的先锋MAA-350卡拉OK机,想把无线话筒接收头加到机器里面。 1、MAA-350的机箱空间蛮大的。

2、该机器的电源很典型,通过变压器输出中心抽头+15/-15V,再用面板上的电源开关——叫直键开关,2X6脚,应该是4组开关,控制电源的通断,接入桥式整流和三端稳压,输出+9V/-9V、+5V。 2、变压器的输出有一端15V输出断了,机器居然能正常工作。

3、电源可以用220V入,+12V出的模块,这个办法要考虑利用电源开关的一组控制;也可以用30V/15V整成12V的电路,输入直接取自板上通过面板开关后的输出,利用3R33板改装为12V输出,加上整流桥就可以,12V/200mA。测量MAA-350变压器输出,标称15V,没有负载时测量为交流17V;打开MAA-350的开关,则为交流15V:将变压器输出接入整流桥,在关闭MAA-350的情况下,变压器输出为16V。

4、由于手头上的3R33只能输入20多伏的电压,故取变压的15V输出加到模块上,整出+12V直流,但发现由于零电位不统一(三端输出,30V),无线麦克风输出干扰声很大。取消了共用变压的想法,另加了一个12V变压器,解决了干扰问题。

4、无线话筒接收器的话筒输出可以直接焊接在MAA-350的话筒输入口边的测试点,每个都有孔可以焊接,11/12插座需要把插头插进,输出点才会与地脱开,所以把电路板上的输出点与插座隔开。

5、同步灯:利用面板上的Tape/recorder输入LED显示灯。MAA-350的LED驱动是+9V/-9V,当LED亮时,控制线-9V,当LED灭时,控制线+9V;接收模块的同步LED输出是当不同步LED亮,输出+2.5V,同步LED灭,输出0V。要把MAA-350的LED限流电阻拆去脱离控制线,并把LED连到+9V的一脚剪断,另一脚起固定作用,再把模块的输出接到LED上,地线可以接到电路板上(该点不与板上电路相连),输出并在间断的腿上。

6、无线话筒接收模块安装:在后面板,要开孔。无线频率为720Mhz,半波天线可采用旧的电视同轴线,末端拨开屏蔽层21cm就可以。说明中要求两个接收模块距离要20cm以上才能避免干扰,实际发现不一定,但还是把距离拉开了,同时把两个模块的频道调到1、10,以便获得最大的频率间隔,避免干扰的发生。

DMS500S设置方法

DMS500S操作方法比较出乎意外,所以要记录一下:

1、环境:四切一两颗星

2、卫星设置方法:遥控器上Menu-设置-频道搜索-卫星设置,选择“非标准用户配置”,用遥控器上最下方的颜色键可以增加LNB对应卫星或删除。设置要点是LNB可以选进去,里面有两页,第一页是设置LNB的频率,可以用于双频率,单频率的只要把Lo和Hi设一样就可以,我的是11300,转折频率可以不改11700。第二页是设置分路器的控制的,我的四切一用的是DiSEqC1.0,所以Toneburst设置为None,DiSEqC选1.0,输出口按1口对应A/A,4口对应B/B。最后还要选22kHz控制信号为None,电压选H/V,用于控制极化。

3、可以用DCC的FTP功能传共享帐号,CCcam.cfg位于var/etc。

4、用台标编辑软件修改组、频道等效率更高。

 

Foobar2000 中加入内嵌cue 的问题

将歌曲索引和相关信息写入flac等文件中,是简化文件个数、信息保存更合理的好办法。但在foobar2000中内嵌cue文件时,常发现引入后相关信息没有正确写入,比如所有的track都是同一个数字,歌名没写入等。其实最重要的原因是原来flac文件中已经有相关的track或title等信息,这时要在foobar2000中将属性中的内容清去,就可以顺利地将相关信息写入flac了。