make在执行makefile中,若没有显式指定目标,默认执行第一个找到的目标。
而一般情况下,一个项目都会生成多个目标(如多个lib,dll,exe)等,所以
需要all
这个伪目标来生成多个目标。
make在执行makefile中,若没有显式指定目标,默认执行第一个找到的目标。
而一般情况下,一个项目都会生成多个目标(如多个lib,dll,exe)等,所以
需要all
这个伪目标来生成多个目标。
先看makefile核心规则
1 | target: prerequisites |
make解析执行makefile判断过程:
target
不存在,则根据prerequisites
,执行commond
target
已存在,则比较target
和prerequisites
修改时间prerequisites
不存在,则不执行commond
!prerequisites
比target
新,则执行commond
(说明在生成target
后,对依赖文件进行了修改)prerequisites
没有target
新,则不执行commond
clean
文件,则根据make解析过程,不会执行后续commond
.PHONY
)伪目标相对于目标而言,其不会生成实体文件
显式告诉make不要跟实体文件进行关联判断,以便执行相应的命令
下载官网,解压
新建build
目录,并进入
生成Makefile
静态库(默认C++运行库为静态链接)
cmake -G "NMake Makefiles" ..
静态库,C++运行库采用动态链接
cmake -G "NMake Makefiles" -Dgtest_force_shared_crt=ON ..
动态库(默认C++运行库为动态链接)
cmake -G "NMake Makefiles" -DBUILD_SHARED_LIBS=ON ..
注:
- 编译示例,`-Dgtest_build_samples=ON`
编译
nmake
msvcprtd.lib(MSVCP100D.dll) : error LNK2005: already defined in gtestd.lib(gtest.obj)
!除了极少数函数调用不会出错(如getpid()
,参考[APUE-8.2]),绝大多数函数都可能发生调用失败。在调用失败时,
就涉及到如何通知调用者,以便调用者进行相对应的错误处理。
所以在C中,往往都采用了折衷的方式,通过使用一个与所有成功结果都不相同的值作为函数失败时的返回值,常见方式有:
失败时返回值
NULL
指针,如fopen
-1
非0
EOF
,SOCKET_ERROR
成功时返回值
0
SOCKET_SUCCESS
积累平时的代码,方便日后的复用。
采用C++,原因如下:
现阶段主要使用C++,虽然也使用部分C库或系统API
提供默认参数值,使接口美观、易用
提供名字空间,可以防止名字污染
提供多态,使接口美观、易用
代码目录怎么组织?
函数调用出错怎么处理?
1 | ; 获取当前选中内容 |