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