Ubuntu系统C++编译

典型例子

makefile内容如下:

main : main.cpp
    g++ -o main main.cpp -std=c++11 -g `sdl2-config --cflags --libs` -I./includes -L./lib -ldtypestd -Wl,-rpath ./lib

 

分析:

-std=c++11 指定用c++11标准

-g                表示可以用gdb调试

-I                 指定头文件包含目录

-L                指定编译时依赖的动态库

-l                 指定具体依赖的去头掐尾库名称

-Wl             选项告诉编译器将后面的参数传递给链接器

-Wl,-rpath   为运行库添加一个搜寻目录-Wl,-rpath,.:..   -Wl,-rpath,'$ORIGIN':'$ORIGIN/lib'  (-Wl,-z,origin非必要,编译器识别origin)

-m32          指定生成x86架构目标,即32位

-m64          指定生成x86_64架构目标,即64位

-shared -fPIC 指定生成动态库

-DLINUX    指定LINUX宏定义

 

`...`             

编译参数

-w -Wall -W -Werror 禁止所有警告 打印有用警告 打印额外警告 警告当错误

-fexceptions     启动异常处理机制try...catch

-frtti                  启动运行类型识别(用户typeid和dynamic_cast)

-O0 -O1 -O2 -O3 优化级别逐渐提升,第一个表示不优化

链接参数

 

关于头文件

搜索-l指定目录,搜索环境变量CPLUS_INCLUDE_PATH指定目录,搜索编译器内定目录。

(环境变量添加目录如下:

export CPLUS_INCLUDE_PATH=XXX:$CPLUS_INCLUDE_PATH

( 编译器内定目录如下:

/usr/include 

/usr/local/include

/usr/lib/gcc/x86_64-linux-gnu/4.8/include

( 另外冒号引用的头文件会先搜索当前目录)

关于链接库

库搜索环境变量LD_LIBRARY_PATH

ln -s <库> <类似快捷方式>

ldconfig -n <目录>                     生成so文件的软连接

ldd <库> 或 ldd <执行体>          查看库和执行体之间的依赖关系

readelf -h *.so                           显示elf文件的头(magic字段第五个字节,01代表32位,02代表64位)

readelf -d *.so                           显示so文件动态区域信息(soname信息)

readelf -d <执行体>                  显示程序依赖的共享库和RPATH路径

顺序是前面依赖后面库

关于库模块

pkg-config来管理库模块,注意通过 /usr/lib/pkgconfig/和PKG_CONFIG_PATH中寻找*.pc文件;

模块搜索环境变量PKG_CONFIG_PATH(搜索所有*.pc)

pkg-config --list-all    列出所有已知包

pkg-config <模块名> --cflags --libs

关于多编译器

查看版本

gcc -v

g++ -v

查看编译器支持GLIBCXX 和 GLIBC版本

strings /usr/lib/gcc/x86_64-linux-gnu/5.4.0/libstdc++.so | grep GLIBC

安装
sudo apt-get install gcc-4.8  g++-4.8

配置gcc
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-5 50
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-4.8 40

选择gcc版本

sudo update-alternatives --config gcc

移除gcc版本

sudo update-alternatives --remove gcc /usr/bin/gcc-4.8

配置g++

sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-5 50
sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-4.8 40

选择g++版本

sudo update-alternatives --config g++

移除g++版本

sudo update-alternatives --remove g++ /usr/bin/g++-4.8

添加仓库安装gcc6   (https://ftp.gnu.org/gnu/gcc/          https://mirrors.tuna.tsinghua.edu.cn/gnu/gcc/)

sudo add-apt-repository ppa:ubuntu-toolchain-r/test
sudo apt-get update
sudo apt-get install gcc-6

集成开发环境

ubuntu 16.04安装codeblocks

sudo add-apt-repository ppa:damien-moore/codeblocks-stable
sudo apt-get update
sudo apt-get install codeblocks codeblocks-contrib

Ubuntu 18.04安装codeblocks

sudo add-apt-repository ppa:pasgui/ppa
sudo apt-get update
sudo apt-get install codeblocks
sudo apt-get install codeblocks-contrib

附录

g++ -c -fPIC -std=c++11 -g -m64 func.cpp 
g++ -c -fPIC -std=c++11 -g -m64 sofunc.cpp 
g++ -c -fPIC -std=c++11 -g -m64 test2.cpp 

ar crs func.a func.o 
g++ -shared sofunc.o -Wl,-soname,libfunc.so.5 -o libfunc.so 
ldconfig -n .
g++ test2.o func.a -Wl,-rpath . -L. -lfunc -luuid -o test 

 

你可能感兴趣的:(系统)