環境:CentOS 7 x64
有編譯后的 .o 文件如下(uSockets):
一開始使用如下命令打包:
[root@jxh obj]# ar r -o libsockets.a *.o ar: 正在創建 libsockets.a ar: context.o: plugin needed to handle lto object ar: epoll_kqueue.o: plugin needed to handle lto object ar: gcd.o: plugin needed to handle lto object ar: libuv.o: plugin needed to handle lto object ar: loop.o: plugin needed to handle lto object ar: socket.o: plugin needed to handle lto object ar: ssl.o: plugin needed to handle lto object
也生成了靜態庫,使用 ar t libusockets.a 查看貌似一切正常(習慣性的忽略了不是error的錯誤)
然后鏈接時總是不成功,報相關函數未定義。
gcc echo_server.c -I./include -L. -lusockets -o server
然后直接使用 .o 文件卻是可以的
gcc echo_server.c usockets/*.o -I./include -o server
說明打包的靜態庫有問題,於是搜了一下 plugin needed to handle lto object 這個錯誤,發現是ar的問題,改為使用gcc-ar就可以了,於是重新打包:
[root@jxh obj]# gcc-ar r libusockets.a *.o /usr/bin/ar: 正在創建 libusockets.a [root@jxh obj]#
然后再次鏈接調用,一切正常。
參考文章:
linux下 GCC編譯鏈接靜態庫&動態庫(靜態庫和動態庫詳細教程)
使用GCC鏈接時優化和靜態鏈接庫(從這里找到的解決方案)