该项目工程结构如下:

test作为主函数调用a中的函数,a.hpp存放函数声明,a.cpp存放函数实现.
g++ test.cpp src/a.cpp -o test会报错,需要加编译参数编译如下:g++ test.cpp src/a.cpp -Iinclude -o test
运行即可
./test
cd srcg++ a.cpp -c -I../include -o a.o
ar rs liba.a a.o
意思是把a.o归档为liba.a的静态库文件
4. 回到主目录(上级目录)cd ..
5. 链接静态库,生成可执行文件test:
-Lsrc是静态链接库所在目录
g++ test.cpp -Iiclude -Lsrc -la -o test
然后就可以执行./test了成功
cd srcg++ a.cpp -I../include -fPIC -shared -o liba.so
#这条指令等价于下边两条命令
#gcc a.cpp -I../include -c -fPIC -o a.o
#gcc -shared -o liba.so a.o
-fPIC是与路径无关的一条指令
-shared表示生成成动态库文件
3. 回到主目录(上级目录)cd ..
4. 链接动态库,生成可执行文件test:
5.直接运行./test会报错,原理后边讲
正确运行静态库生成的可执行文件如下:
LD_LIBRARY_PATH=src ./test
LD_LIBRARY_PATH