之前在这篇文章里介绍过动态库和静态库的理论部分,这篇文章主要介绍下实际的操作步骤:

静态链接库生成

gcc -c main.cpp -o main.o
ar -rc libmain.a main.o
sudo cp libmain.a /usr/local/lib
调用即可

解释一下上面的命令:前两步生成了libmain.a
sudo cp libmain.a /usr/local/lib 这一步是防止出现报错 /usr/bin/ld:cannot find -l,或者使用软链接
  调用的话我使用cmake形式,在CMakelists.txt中写target_link_libraries(${PROJECT_NAME} libmain.a mosquitto)
注意:如果静态库调用了其他库(本例是mosquitto)一定要放在左边,否则报错undefine,可能是从右往左读

动态链接库生成

gcc -c main.cpp -o main.o
gcc -shared main.o -o libmain.so
调用即可

 解释一下上面的命令:前两步生成libmain.so,sudo cp libmain.so /usr/local/lib 这一步是防止出现报错 /usr/bin/ld:cannot find -l,或者使用软链接
  调用的话我使用cmake形式,在CMakelists.txt中写target_link_libraries(${PROJECT_NAME} libmain.so mosquitto)
注意:如果静态库调用了其他库(本例是mosquitto)一定要放在左边,否则报错undefine,可能是从右往左读

注明一下过程中可能有的报错:

报错1:

/usr/bin/ld:cannot find -l

解决办法:执行上面的cp命令,或者使用软链接,让/usr/local/lib下能够找到该库

报错2:

cp: cannot stat '/usr/local/bin/node': Too many levels of symbolic links

解决办法:这个是因为有了软链接又想cp过去,删除软链接后cp即可

报错3:

/usr/bin/ld: skipping incompatible

解决办法:这个是环境不兼容,用了x86的结构下生成的包在arm下使用,再重新生成一个本地包即可