《CMake实践》的第三章,初试cmake - cmake的helloworld 中的
PROJECT (HELLO)
SET(SRC_LIST main.c)
MESSAGE(status "This is BINARY dir " ${HELLO_BINARY_DIR})
MESSAGE(status "This is SOURCE dir " ${HELLO_SOURCE_DIR})
ADD_EXECUTABLE(hello SRC_LIST)
报错
《CMake实践》的第三章,初试cmake - cmake的helloworld 中的
PROJECT (HELLO)
SET(SRC_LIST main.c)
MESSAGE(status "This is BINARY dir " ${HELLO_BINARY_DIR})
MESSAGE(status "This is SOURCE dir " ${HELLO_SOURCE_DIR})
ADD_EXECUTABLE(hello SRC_LIST)
报错
用过Windows的我们都知道,当我们无法正常结束一个程序时,可以用任务管理器强制结束这个进程,但这其实是怎么实现的呢?同样的功能在Linux上是通过生成信号和捕获信号来实现的,运行中的进程捕获到这个信号然后作出一定的操作并最终被终止。
信号是UNIX和Linux系统响应某些条件而产生的一个事件,接收到该信号的进程会相应地采取一些行动。通常信号是由一个错误产生的。但它们还可以作为进程间通信或修改行为的一种方式,明确地由一个进程发送给另一个进程。一个信号的产生叫生成,接收到一个信号叫捕获。
本小节主要描述了如何在工程中使用多目录、各种安装指令以及CMAKE_INSTALL_PREFIX变量(你真够牛的,这么点东西居然罗唆了这么多文字)在下一小节,我们将探讨如何在cmake中构建动态库和静态库,以及如何使用外部头文件和外部共享库,毕竟,这是程序编写中最长使用的(对了,你知道用怎样的gcc参数可以直接构建静态库和动态库吗?)
首先给出《The_C_Programming_Language》这本书中的例子:
#include <stdio.h> int main() { int c; c = getchar(); while (c != EOF) { putchar(); c = getchar(); } return 0; }
这里主要解释下为什么要用int型来接受getchar函数。
#include <stdio.h> #include <math.h> main() { int i; int x = 16, y = 2; i = 12 * pow(x, y); printf("%d\n", i); }
编译 gcc area.c -0 area.out
报错
/tmp/ccEA3QIN.o: In function `main':
a.c:(.text+0x25): undefined reference to `pow'
Makefile拥有复杂的语法结构,甚至让人难以领会,当我们项目非常大的时候,维护Makefile会成为一件非常头疼的事情。于是我们就有了Autotools工具,专门用来生成Makefile,这个工具让我们很大程度的降低了开发的难度。
realloc()函数用来为ptr重新分配大小为size的一块内存,看似很简单,在使用过程中却会发生各种错误。
函数形式为:
void * realloc ( void * ptr, size_t new_size );
库从本质上来说是一种可执行代码的二进制格式,可以被载入内存中执行。库分静态库和动态库两种。
一、静态库和动态库的区别
1、静态函数库
这类库的名字一般是libxxx.a;利用静态函数库编译成的文件比较大--空间,因为整个函数库的所有数据都会被整合进目标代码中。。。
2、动态函数库
这类库的名字一般是libxxx.so;相对于静态函数库,动态函数库在编译的时候并没有被编译进目标代码中,你的程序执行到相关函数时才调用该函数库里的相应函数。。。
PHP_FUNCTION(php_array_square_sum) 宏替换后:
void zif_php_array_square_sum( int ht, zval *return_value, zval **return_value_ptr, zval *this_ptr, int return_value_used, void ***tsrm_ls )
我们已经知道,我们可以通过信号来终止进程,也可以通过信号来在进程间进行通信,程序也可以通过指定信号的关联处理函数来改变信号的默认处理方式,也可以屏蔽某些信号,使其不能传递给进程。那么我们应该如何设定我们需要处理的信号,我们不需要处理哪些信号等问题呢?信号集函数就是帮助我们解决这些问题的。
下面是信号函数集:
1、int sigemptyset(sigset_t *set);
该函数的作用是将信号集初始化为空。
2、int sigfillset(sigset_t *set);
该函数的作用是把信号集初始化包含所有已定义的信号。
3、int sigaddset(sigset_t *set, int signo);
该函数的作用是把信号signo添加到信号集set中,成功时返回0,失败时返回-1。