进程丢失的办法
https://www.cnblogs.com/xybaby/p/8098229.html
关注他的博文
https://lwn.net/Articles/317814/
https://stackoverflow.com/questions/726690/what-killed-my-process-and-why
https://latedev.wordpress.com/2014/04/22/common-c-error-messages-2-unresolved-reference/
https://latedev.wordpress.com/2011/07/08/the-gcc-command-line-part-1/
首先看一看链接器的作用。在构建c++程序的时候,几乎所有的程序都由多个c++源文件组成。使用c++编译器分别编译这些文件,以生成包含机器代码的目标文件(.o 或者 .obj 文件),每个目标文件对其他文件一无所知。所以,如果从另一个目标文件中存在的一个目标文件调用函数,则编译器将无法提供被调用函数的地址。
一旦生成了所有的目标文件,想要生成最终的可执行文件,那么链接器就会查看他们并计算出可执行文件中函数的最终地址是什么。然后他修补了编译器无法提供的地址。对于可能使用的任何库(.a 和 .lib 文件) ,他都执行相同的操作。最后,他将可执行文件写到磁盘。
链接器通常是与编译器分开的程序,例如:gcc 链接器成为 ld。传统上,链接器技术落后于编译器,主要是因为构建编译器比构建链接器通常更加有趣。并且链接程序不一定有权访问他们正在链接的目标文件的源代码。
linux 系统调用及错误处理:https://blog.csdn.net/freecls/article/details/80369878
1 | void perror(const char *msg); |
1 | char *strerror(int errnum); |
二分查找的时间复杂度:logn
1 | bool binary_sort(std::vector<int>& vec, int value) { |
注意循环条件为:left <= right 以及注意 left + right 越界的情况
1 | def divide_conquer(problem, param1, param2, ...): |
前序、中序、后序的非递归算法
前序
1 | void PreOrderIteration(TreeNode* root) { |
中序