編譯器優化異常
⑴ PCL編譯 SSE優化導致的移植錯誤 Illegal instruction
自己使用了pcl的程序在自己的電腦上運行正常,但是打包到其他的電腦上運行時報段錯誤(segmentation fault),然後使用gdb調試的時候,發現類似如下錯誤點:
無論你使用的是pcl的動態庫( *.so )還是靜態庫( *.a ),就很奇怪:
自行編譯pcl的時候,cmake會自動檢測機器能進行的優化,然後可能會給編譯器加上 -march=native 的編譯選項, 進行 SSE 等適合本地機器的優化,能起到加速的作用。
指定了-march參數,gcc將不會再用兼容的指令去編譯。
如果只是自己電腦用,沒有什麼問題,但是如果編譯的庫還要在其他的電腦上使用,如果其他的機器不具備這些優化的硬體,指令就執行不了,就會報 Illegal instruction 的錯誤,呈現在上面就是段錯誤(segmentation fault)
之所以上面的錯誤在別的電腦上還能知道自己電腦上特定文件的位置呢,因為PCL編譯的時候默認的編譯類型是 RelWithDebInfo ,這樣編譯出來的庫是有調試信息的,所以能指向特定文件位置。
編譯PCL的時候,如果只有自己使用,開啟也沒有關系,還能加速。
如果是編譯公共庫或者程序要在其他的機器上運行,建議不要開啟SSE優化。
關閉SSE優化後的PCL的庫(無論是動態庫還是靜態庫),其他程序依賴之後就不會產生上面的 No such file or directory 的錯誤。
如果開啟了。cmake的時候,中間輸出信息中會有 Using CPU native flags for SSE optimization: -march=native 的輸出,如下圖所示
在PCL源碼cmake文件夾下,有個pcl_options.cmake的文件
找到下面的內容。默認第二個時 ON,把它改成 OFF即可
⑵ ARMClang6.1編譯優化導致的訪問不對齊異常
keil-project-options for target-選項卡c/c++ 左側中間有個optimization 後面的對應的就是編譯優化設置 level 0就是不優化
⑶ 關閉編譯器內聯優化命令
方法如下:
1、可以通過設置編譯器選項虧昌禁止對strcpy、strcat等函數唯遲內聯,這樣就可以從匯編代碼來關閉。
2、在release版本可以選擇指空李在配置屬性點擊C+進行優化。
⑷ Debug模式下怎樣去掉編譯器的優化解決思路
通常開發的程序有2種模式:Debug模式和Release模式。
在Debug模式下,編譯器會記錄很多調試信息,也可以加入很多測試代碼,方便程序員測試,以及出現bug時的分析解決。
Release模式下,就沒有上述那些調試信息,而且編譯器也會自動優化一些代碼,這樣生成的程序性能是最優的,但是如果出現問題,就不方便分析測試了。
⑸ 如何防止因編譯器開啟優化,而導致程序執行錯誤
我的經驗是:未優化的c程序可正常運行,優化後不能運行,那一定是我的程序有問題。我還沒經歷過不是我程序的情況。
發現這種不易發現的問題,需要看匯編碼。
避免的方法,我的經驗:寫c程序,盡量規矩;似是而非的概念,一定要搞清楚,別僥幸。因為僥幸而留的雷,現在不出問題,將來一定會出問題;不優化不出問題,優化就出問題。
最後要說,每個應用程序,都讓他開優化運行,只要時間允許,一定要查出開優化後出問題的原因。時間不允許,只能不開優化湊合著,在有時間的時候繼續查問題。