1、在Linux下,動態庫和靜態庫同事存在時,gcc/g++的鏈接程序,默認鏈接的動態庫。
可以使用下面的方法,給連接器傳遞參數,看是否鏈接動態庫還是靜態庫。
-WI,-Bstatic -llibname //指定讓gcc/g++鏈接靜態庫
使用:
gcc/g++ test.c -o test -WI,-Bstatic -llibname
-WI,-Bdynamic -llibname //指定讓gcc/g++鏈接動態庫
使用:
gcc/g++ test.c -o test -WI,-Bdynamic -llibname
如果要完全靜態加在,使用-static參數,即將所有的庫以靜態的方式鏈入可執行程序,這樣生成的可執行程序,不再依賴任何庫,同事出現的問題是,這樣編譯出來的程序非常大,占用空間。
2、Linux下動態庫為什么會出現編譯OK,運行時找不到的情況。
原因是:
linux下鏈接器默認是不記錄庫的搜索路徑的,只記錄名字,所以才會有編譯時OK,但運行時,找不到的情況。
解決方法:
想在程序中記錄路徑,可以使用-WI,-rlibpath指定動態庫的搜索路徑。
使用方法。
gcc/g++ test.c -o test -WI,rlibpath -llibname
3、關于Linux下庫的更多問題,可以參看:
自己的博客: http://blog.163.com/xychenbaihu@yeah/blog/static/13222965520101023104745738/
http://xiaobin.net/200911/analytics-on-unix-static-and-dynamic-library/