[c++笔记]关于编译

一、编译成目标文件

g++ -c main.cpp
以上命令会生成mian.o文件


若cpp文件中没有main()函数,以上命令则会报错,这时需加上“-fpic”

g++ -fpic -c ini.cpp

若cpp中include了其他目录的头文件,如第三方类库,则可加“-I path”指明包含路径,可以同时加多个,每个“-I path”之间用空格分隔
如ini.cpp 有
#include <boost/property_tree/ptree.hpp>

假设你的boost存放路径是 /data/boost/, 那么编译命令就是
g++ -fpic -c ini.cpp -I/data/lib/



二、链接
g++ -o test.out mian.o ini.o


把mian.o ini.o链接打包成可执行文件test.out ,这种方式是把所有之前生成的目标文件都链接在以前并打包进一个文件(test.out)

其实有些库是可以共享,不需要都打包在一起的,那我们就可以编译一个动态链接库
g++ -shared -o libini.so ini.o xx.o


如果编译的共享库还要依赖其它的共享库,最好编译时一并解决依赖问题(加“-l”参数),虽然这时不解决也不会报错(除非加“-Wl,--no-undefined”参数),但应用程序链接这个共享库时,必须加上这些依赖库的列表

g++ -shared  -Wl,--no-undefined -fPIC -o libini.so  ini.cpp  -l boost_system






这个是链接一个动态链接库(标准命名是 libxxx.so)
g++ -o test.out mian.o -lxxx -L./lib/


若.so文件是标准命名,-lxxx 就是链接 libxxx.so 这个动态库, -L./lib/ 是指定一个.so文件的搜索目录。这样链接不会吧.so文件打包进
test.out文件中,执行时会去其系统包含路径中找 libini.so,所以如此链接后还不能正确执行的,需吧路径 ./lib/ 加入系统包含路径里

你可能感兴趣的:(C++)