C++的编译过程分为三步:预处理->编译->链接
    链接是将多个目标文件(.o)和库文件合成最终的可执行文件
    
    动态链接-在运行期间通过动态链接器加载.so/.dll库  程序中只存在函数符号的引用 而非实际的代码
    静态链接-在编译期间将.a库中的代码 直接打包到可执行文件 不依赖外部库可独立运行

linux下的编译

一般用gcc编译c代码,用g++编译C++代码
    1.预处理 (.i文件)处理头文件,宏定义等 
        g++ -E test.cpp -o test.i      -E是仅预处理 指定源文件  -o test.i是指定输出文件名  后面也一样
    2.编译 (.s文件)
        g++ -s test.i -o test.s
    3.汇编 (.o文件)
        g++ -c test.s -o test.o
    4.链接 (bin文件)
        g++ temp.o -o test
    
    以上4步可以用一条指令完成 
        g++ test.cpp -o test
        
        
        
        
    -g  产生带调试信息的可执行文件 否则GDB无法调试
    -o[n]优化代码 如 -o1  -o2 可以提高执行速度
    time ./test 可以查看执行耗时
    -wall 打印警告信息 -w关闭警告信息
    -std=c++11 设置编译标准
    -D定义宏 g++ -DABC main.cpp  main.cpp中可以写#ifdef ABC   ...#endif
    
    
链接库
    一、库在 /lib 或 /usr/lib 或 /usr/local/lib
        用-l紧接库名
    二、库不在上述路径 
        用大写L+目录 再用-l接库名
        
静态库编译
    1.g++将.cpp编译成.o     g++ -c xxx.cpp
    2.打包编译              ar res libxxx.a xxx.o
    3.使用                 g++ main.cpp -L. -lxxx -o app
    4.执行                 ./cpp
动态库编译
    g++ -fpic -c math.cpp
    g++ -shared -o libmath.so math.o
    g++ main.cpp -L. -lmath -o app
    export LD_LIBRARY_PATH=.   告诉动态库位置
    
    
    
 指定头文件搜索目录 -I
    g++ -I/myinclude test.cpp
    
    
CMake
    基本格式    指令(参数1 参数2...)
        参数使用括弧括起来
        参数之间用空格或分号分开
    
    指令大小写无关     参数、变量大小写相关
    变量用${变量名}取值  IF中直接用变量名取值
    
 重要指令
    cmake_minimum_required(VERSION 2.8.3)   指定cmake最小版本要求
    project(HELLOWORLD)     指定工程名称
    set(SRC a.cpp b.cpp)    显式定义变量SRC的值为 a.cpp b.cpp
    include_directories(/usr/include ./include) 向工程添加多个头文件搜索路径 相当于g++的-I
    link_directories(/usr/lib ./lib)    向工程添加多个库文件搜索路径 相当于g++的-L
    add_library(hello SHARED ${SRC})    生成库文件 参数  库名 动态库.so 
    add_compile_options(-wall -std=c++11 -o2)   添加编译参数
    add_executable(main main.cpp)   生成可执行文件
    target_link_libraries(main hello)   为工程添加需要链接的库 相当于g++的-l参数   可执行文件 库名
    add_subdirectory(src)   向当前工程添加存放源文件的子目录(目录中要有cmakelists.txt)并可以指定中间二进制和目标二进制存放的位置
    aux_suorce_directory(. src)  发现一个目录下的所有源代码 并存储在一个变量中
    
 常用变量
    CMAKE_C_FLAGS   gcc编译选项
    CMAKE_CXX_FLAGS     g++编译选项
    CMAKE_BUILD_TYPE    编译类型(Debug  Release)
 cmake编译工程
    主目录需要存在一个cmakelists.txt
    两种规则
    1.包含源文件的子文件夹有cmakelists.txt文件 主目录的cmakelists.txt通过add_subdirectory添加子目录
    2.包含源码的子文件夹没有cmakelists.txt子目录编译规则体现在子目录中
    
 编译过程
    1.手动编写cmakelists.txt
    2.执行cmake命令生成Makefile
    3.执行make命令进行编译
    
    . ./当前目录    ..  ../上级目录
    
    
    内部构建 (不推荐使用)
    在顶层目录下 cmake. make 文件会生成在顶层目录下
    
    外部构建  编译会输出到build文件夹中
    mkdir build
    cd build
    cmake ..
    make
 

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐