生成共享库 要先生成目标文件 然后才能生成共享库
第一步:g++ -c *.cpp -I ../inc -g -Wall //编译生成目标文件.o -I是指定要包含的头文件 -g 在目标文件中包含debug信息 -wall 打开所有警告信息
第二步:g++ -shared say_hello.o say_goodbay.o -o ../lib/libspeak.so //把say_hello.o和say_goodbay.o编译生成共享库文件libspeak.so
第二步:ld -G -o say_goodby.o say_hello.o ../lib/libspeak.so
--------------------------------------------------------------------------------------------------------------------
生成静态库, 也是先生成目标文件 然后才能生成静态库
第一步:g++ -c say_goodbye.cpp I"../inc" //-I就是指定所要需要
g++ -c say_hello.cpp I"../inc" //生成两个.o文件
第二步:ar -r ../lib/libspeak_a.a say_goodbye.o say_hello.o//生成静态库 后面是生成路径 //这里的位置是不能调换的
--------------------------------------------------------------------------------------------------------------------
//共享库是你编译的时候要用到他,运行的时候也要用到他,因为你程序的一部分功是在共享库里面,运行时也依赖于这个库,
//静态库是你编译用到他,但是运行时不会用到他,因为你那个可执行程序已经拷贝到你的可执行程序中啦, 就不需要你说的那个库啦;
调用共享库:
第一种形式:g++ test_drv.cpp -o test_drv -I"../inc" -l speak -L"../lib" //g++编译test_drv.cpp生成test_drv可执行程序,指定调用../目录下的下的speak库
//运行的时候,要调用共享库 //导入环境变量
export LD_LIBRARY_PATH="../lib:$LD_LIBRARY_PATH"
--------------------------------------------------------------------------------------------------------------------
调用静态库
第一种:
g++ -o test_drv test_drv.cpp -I"../inc" -L"../lib" -lspeak_a //编译test_drv.cpp文件生成test_drv 指定要包含的头文件目录../inc,要链接../inc目录下的speak库
第二种:
g++ -o test_drv test_drv.cpp -I"../inc" ../lib/libspeak_a.a // //直接指定
//编译生成的
//运行的时候不要库的依赖
-l//连接到共享库 后面跟的库speak 就是找libspeak ,生成这个库的时候必须是lib开头,否则他就不能被识别 注意 共享库和静态库是编译的源文件
-L指定连接的库所在的路径 其默认制定/usr/lib 、 /usr/local/lib 或由 LD_LIBRARY_PATH 指定的目录下 ,也就是说你不加也默认搜索这些库
--------------------------------------------------------------------------------------------------------------------
//
-64系统编译的库或者可执行文件时,要加 -fpic选项
//共享库的运行期路径问题 就是你运行的时候不指定共享库的路径 也能运行
第一种:是是把共享库拷贝到/usr/lib 、 /usr/local/lib 目录下就可以
第二种:LD_LIBRARY_PATH 指定的目录下,LD_LIBRARY_PATH环境变量,要保存到./bashrc文件中 别的系统要拷贝到./profile文件中
第三种:使用 ldconfig 机制
在 /etc/ld.so.conf.d/ 下创建一个 .conf 文件,如 libspeak.conf
内容为共享库所在目录的绝对路径 这个libspeak是和你那个创建的库名字是一致的 这个绝对路径是 /所在的目录,就是root所在的那个目录
然后,运行 ldconfig