1、山顶洞人版C++程序编译法:手动编译方式
工具:VIM + g++编译器
步骤:假如有如下的两个源文件和一个头文件:
第一个源文件: a.cpp 内容如下
#include<iostream>
#include"b.h"
void goodbye(void);
int main(void)
{
using namespace std;
cout <<"girl: Are you OK ?\n";
answer();
goodbye();
return 0;
}
void goodbye(void)
{
using namespace std;
cout << "girl: Ok ,Good Bye.\n";
}
第二个源文件: b.cpp 内容如下
#include<iostream>
void answer(void)
{
using namespace std;
cout << "zhinan: I am really ok ." << endl:
}
头文件 B.h 的内容如下:
void answer(void);
那么如果采用手动编译和链接的话,在Linux终端窗口中应该输入:
sudo g++ b.cpp a.cpp -o test
然后就会生成可执行文件test,再在终端中输入:
./test
就可以运行可执行程序,最终的输出如下:
girl: Are you OK ?
zhinan: I am really ok .
girl: Ok ,Good Bye.
2、现当代版C++项目管理方式:使用Cmake进行C++项目管理
要学cmake首推那篇闻名于世的小书或者称之为长文吧, 就是《CMake-Pratice》,看完它之后绝对不虚CMake。
学会cmake之后,后期还要结合 gdb 进行程序的调试
工具:VIM + cmake + make( 此时g++编译器被make指令调用,所以不需要我们手动调用g++编译器了)
步骤:简单的说就是借助一个叫做 cmake 的跨平台的编译工具,这个工具有自己的一套语法,对于项目开发者而言,使用这个工具能更方便、灵活的管理自己的软件项目。
第一步:使用“sudo vim CMakeLists.txt”指令生成自己的 “CMakeLists.txt” 文件,文件名必须是这个文件名,不然等会儿cmake指令找不到这个文件会报错(大小写字母也得必须一致,不然也会报错),Cmake的语法建议参考一篇叫做Cmake_practice的文章,里面讲的东西对于cmake语法的入门足够了。
第二步:使用“sudo cmake .”(注意cmake指令后面有一个英文的句号额,表示在当前目录下执行cmake指令),执行对该工程的cmake编译(这个cmake编译还没有涉及到对程序的编译,只是cmake指令自身进行项目的组织管理),执行完之后会自动生成Makefile和其他的一些中间文件。
由于这一步会生成许多的中间文件,就会让当前文件夹看上去很乱,所以为了然这些中间文件都放在一个文件夹中,可以在当前目录下新建一个叫做“build”的文件夹,然后“cd build”进入这个文件夹,在该文件夹中,使用“cmake …”(注意此时cmake后面有两个句点了额),那么生成的中间文件就都在这个文件夹下面了。下一步的“sudo make”仍然需要在这个文件夹下面运行,不然会出现找不到Makefile的错误信息。
第三步:使用“sudo make”对工程进行编译(这个就是make指令调用g++编译器开始对我们的源代码以及相关的库文件、头文件进行编译操作了),生成可还行文件
第四步:运行可执行文件。
加料:
1、 库的使用
(1)、制作和使用自己的
一般情况下,库里面一般都是存放一些使用率很高或着通用的函数,将这些函数编辑好之后,将它们封装在一个库当中,以后只要有这个库文件和描述这个库文件的头文件就可以轻松的使用库当中的函数了。
下面一个实际的例子:
首先新建一个 cpp 源文件,将其命名为print.cpp
sudo vim print.cpp
,并且将函数定义在其中:
#include<iostream>
using std::cout;
void printsome(void)
{
cout << "Girl: You are handsome,boy ~.\n";
}
这样的话等一会儿生成的库当中,就会有printfsome 这个函数了,
在CMakeLists.txt文件中添加以下语句:
add_library(print print.cpp)
这条语句就告诉了cmake我们希望把print.cpp这个文件编译成一个叫做print的库。
和刚才一样,为了避免中间生成的中间文件使目录显得很乱,我们进入刚才的build文件夹,在该文件夹中调用cmake指令和make指令:
cd build
cmake …
make
此时,在build文件夹中就会生成一个 print.a 文件,这就是库文件。
在Linux中,库文件分成静态库和共享库,静态库以 .a 作为后缀,共享库以 .so 作为后缀,所有的库都是一些函数打包后的集合,差别在于,静态库每次调用都会生成一个副本,而共享库则只有一个副本(无论调用多少次),更省空间。如果希望生成共享库,将刚才CMakeLists.txt文件中的语句改成如下:
add_library(print_shared SHARED print.cpp)
就可以将print.cpp 编译得到: print_shared.so 文件,这个就是共享库了。
库文件的本质是一个编译好的二进制函数文件,如果仅有 .a 或者 .so 库文件,那么对于最终的用户(即:程序猿)而言,它是不知道里面有哪些函数的,也不知道该怎么用这些函数,所以为了使用这个库文件中的函数,还需要配套提供一个头文件,对库里面的函数进行说明,那么,只要程序员得到了库文件和头文件就能无障碍调用这个库了,现在就来新建这个头文件:
首先输入指令:sudo vim print.h
然后编辑如下:
#ifndef PRINT_H_
#define PRINT_H_
void printsome(void);//提供函数printsome的原型
#endif
编辑完后退出文件。
现在就使用这个头文件结合刚才生成的库文件编写一个程序:
新建一个叫做:talk.cpp 的源文件,
sudo vim talk.cpp
然后输入以下内容:
#include<iostream>
#include"print.h"
int main(void)
{
using std::cout;
using std::endl;
printsome();
cout << "Zhinan: There are always people say this to me ,so it is something no strange.\n";
cout << "Girl : Roll out of the atmosphere." << endl;
return 0;
}
然后还需要在刚才的CMakeLists.txt文件中的新增下面的语句:
add_executable(print talk.cpp)
target_link_libraries(print print_shared)
最终编辑的 CMakeLists.txt文件应该如下面的样子:
#声明要求的cmake的最低版本
cmake_minimum_required(VERSION 2.8)
#声明一个cmake工程,将其命名为printtest
project(printtest)
#生成共享库
add_library(print_shared SHARED print.cpp)
#添加一个可执行程序
#语法:add_executable(可执行程序名 源代码文件名)
add_executable(print talk.cpp)
target_link_libraries(print print_shared)