g++编译笔记
一些注意点
- 动态库相关环境变量:
export LIBRARY_PATH=LIBDIR1:LIBDIR2:$LIBRARY_PATH # 编译期间动态库路径
export LD_LIBRARY_PATH=LIBDIR1:LIBDIR2:$LD_LIBRARY_PATH # 二进制程序加载动态库路径
- 静态库编译:
g++ -c base.cpp -o libbase.o
ar -rs libbase.a libbase.o
- 动态库编译,同时链接一个静态库:
g++ -fPIC -shared -I. -L. -lbase son.cpp -o libson.so
其中-I 是指定头文件目录,-L指定库目录,可以重复多个
-
添加链接库时,如果库之间有依赖关系,则被依赖的库要后置,例如:g++ -I. -L. -lobj -lbase main.cpp -o main,其中obj依赖base。
-
链接库时,默认规则是优先选择动态库,找不到再找静态库。
一些实例
依赖关系:base->son->main
静态编译libbase.a,动态编译libson.so
编译main的时候仍需指定链接静态库
g++ -c base.cpp -o base.o
ar -rcs libbase.a base.o
g++ -fPIC -shared -I. -L. -lbase son.cpp -o libson.so
g++ -I. -L. -lson -lbase main_obj.cpp -o main
makefile经典问答
@
变量的含义 https://stackoverflow.com/questions/3220277/what-do-the-makefile-symbols-and-mean
target::
do something
相当于每次都可以触发