Makefile編譯問題彙總

最近使用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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章