最近使用makefile編譯遇到了些問題,反覆地排查了4天多,才解決,要處理的問題很簡單,就是把一堆.c文件編譯打包成.so,然後再把.so和demo.o打包成可執行文件,遇到了下面 三個問題,總結一下:
(1)問題描述在這裏http://bbs.csdn.net/topics/392070647
原因:在生成可執行文件的時候,加入了-shared參數,這時生成的並不是可執行文件,而是動態庫,使用file命令查看即可看到文件的具體信息
解決方案:CFLAGS裏去掉-shared參數,改爲在要生成庫的時候,手動添加-shared參數
(2)將之前的.so改爲生成.a,然後打包生成可執行文件,生成失敗,顯示demo調用的庫裏定義的函數全部都找不到
原因:在鏈接的時候,編譯器會按照從前往後的順序尋找定義的函數、變量,先找到了一些調用,再在後面的.a中找函數的定義,因此這裏打包的時候,.a和demo.o的順序搞反了
解決方案:講makefile裏生成可執行文件時的依賴項的順序調整一下,把庫寫在demo.o的後面,如下
pps_demo: $(DEMO_OBJ) lib_darknet.a
$(CC) $(CFLAGS) -o $@ $^ $(LDFLAGS)
另外,同事建議,打包時的輸入依賴項不要寫成$^
而是手動輸入需要依賴哪些,這些會防止一些不必要的錯誤
(3)在生成庫的時候,出現瞭如下錯誤
undefined reference to symbol 'pow@@GLIBC_2.2.5'
原因:不明確
解決方案:在LDFLAGS裏添加-lm
P.S.
makefile裏有時候定義的宏失效,這個也是跟編譯參數的順序有關的,宏定義在編譯目標文件的時候要放在-c後邊,參考這篇博客
http://blog.csdn.net/zww0815/article/details/51275274