2014-09-28 54 views
7

我試圖在Ubuntu 14.04上安裝包gcc-arm-linux-gnueabig++-arm-linux-gnueabi來編譯庫。使用g ++時包含C++系統頭文件的正確方法 - arm-linux-gnueabi?

編譯失敗上它遇到的第一個源文件:

/usr/bin/arm-linux-gnueabi-g++ -DNDEBUG -g2 -Os -pipe -fPIC -I. -DCRYPTOPP_DISABLE_ASM 
-mcpu=cortex-m3 -mthumb --sysroot=/usr/arm-linux-gnueabi -c 3way.cpp 
In file included from cryptlib.h:83:0, 
       from seckey.h:8, 
       from 3way.h:7, 
       from 3way.cpp:5: 
stdcpp.h:14:18: fatal error: memory: No such file or directory 
compilation terminated. 

當我執行find我看到,C++頭分別位於:

$ find /usr -name memory 
/usr/arm-linux-gnueabi/include/c++/4.7.3/tr1/memory 
/usr/arm-linux-gnueabi/include/c++/4.7.3/memory 
/usr/arm-linux-gnueabi/include/c++/4.7.3/ext/memory 
... 

/usr/arm-linux-gnueabi已經爲SYSROOT提供:

$ ls /usr/arm-linux-gnueabi 
bin include lib 

添加一個isysroot沒有幫助:

/usr/bin/arm-linux-gnueabi-g++ -DNDEBUG -g2 -Os -pipe -fPIC -DCRYPTOPP_DISABLE_ASM 
-mcpu=cortex-m3 -mthumb -isysroot=/usr/arm-linux-gnueabi/include/c++/4.7.3 
--sysroot=/usr/arm-linux-gnueabi -c 3way.cpp 
In file included from cryptlib.h:83:0, 
       from seckey.h:8, 
       from 3way.h:7, 
       from 3way.cpp:5: 
stdcpp.h:14:18: fatal error: memory: No such file or directory 

我跨編譯在其他平臺上的庫(如Android,iOS和Windows Phone),所以我有需要做什麼好主意。不過,這是我第一次與arm-linux-gnueabi

使用g++-arm-linux-gnueabi包時,包含C++頭文件和庫的正確方法是什麼?

相關:應該不是spec文件已經處理了嗎?


編輯:這裏有一些-v相關信息。這些內置的路徑看起來不健康。它看起來像工具鏈正在試圖形成路徑C++頭文件,但它不是做得很好:

/usr/bin/arm-linux-gnueabi-g++ -v -DNDEBUG -g2 -Os -pipe -fPIC -DCRYPTOPP_DISABLE_ASM 
-mcpu=cortex-m3 -mthumb --sysroot=/usr/arm-linux-gnueabi -c 3way.cpp 

... 
GGC heuristics: --param ggc-min-expand=100 --param ggc-min-heapsize=131072 
ignoring nonexistent directory "=/usr/arm-linux-gnueabi/include/c++/4.7.3/usr/arm-linux-gnueabi/include/c++/4.7.3" 
ignoring nonexistent directory "=/usr/arm-linux-gnueabi/include/c++/4.7.3/usr/arm-linux-gnueabi/include/c++/4.7.3/arm-linux-gnueabi/sf" 
ignoring nonexistent directory "=/usr/arm-linux-gnueabi/include/c++/4.7.3/usr/arm-linux-gnueabi/include/c++/4.7.3/backward" 
ignoring nonexistent directory "=/usr/arm-linux-gnueabi/include/c++/4.7.3/usr/local/include/arm-linux-gnueabi" 
ignoring nonexistent directory "=/usr/arm-linux-gnueabi/include/c++/4.7.3/usr/include/arm-linux-gnueabi" 
ignoring nonexistent directory "=/usr/arm-linux-gnueabi/include/c++/4.7.3/usr/include" 
#include "..." search starts here: 
#include <...> search starts here: 
/usr/lib/gcc-cross/arm-linux-gnueabi/4.7/include 
/usr/lib/gcc-cross/arm-linux-gnueabi/4.7/include-fixed 
/usr/lib/gcc-cross/arm-linux-gnueabi/4.7/../../../../arm-linux-gnueabi/include 
End of search list. 
GNU C++ (Ubuntu/Linaro 4.7.3-12ubuntu1) version 4.7.3 (arm-linux-gnueabi) 
... 

編輯:這看起來像被用在內部通道中的錯誤工具鏈。在內置路徑中,請注意路徑中還有一個額外的/usr/arm-linux-gnueabi。以下答案提供了一種解決方法。

Ubuntu提交的錯誤報告:g++-arm-linux-gnueabi cannot compile a C++ program with --sysroot

+1

什麼是你的目標CPU您使用的Linux編譯器,但-mcpu = Cortex-M3的,這是不太可能在運行Linux至少不是全功能的版本。看看[Buildroot](http://buildroot.uclibc.org/)並將其配置爲適當的目標。 – yegorich 2014-09-28 21:06:28

+0

@yegorich - 謝謝(我忘了uclib和buildroot)。這是目前的測試,所以我可以選擇任何CPU進行測試。它是一個測試,因爲我專注於程序,而不是CPU。你會爲'arm-linux-gnueabi'提出什麼樣的CPU? – jww 2014-09-28 21:15:36

+1

用'--sysroot/usr'而不是'--sysroot =/usr'試試?你在路徑中有相同的標誌,那絕對不應該是...... – 2014-09-29 00:37:39

回答

1
GGC heuristics: --param ggc-min-expand=100 --param ggc-min-heapsize=131072 
ignoring nonexistent directory "=/usr/arm-linux-gnueabi/include/c++/4.7.3/usr/arm-linux-gnueabi/include/c++/4.7.3" 
ignoring nonexistent directory "=/usr/arm-linux-gnueabi/include/c++/4.7.3/usr/arm-linux-gnueabi/include/c++/4.7.3/arm-linux-gnueabi/sf" 
ignoring nonexistent directory "=/usr/arm-linux-gnueabi/include/c++/4.7.3/usr/arm-linux-gnueabi/include/c++/4.7.3/backward" 
ignoring nonexistent directory "=/usr/arm-linux-gnueabi/include/c++/4.7.3/usr/local/include/arm-linux-gnueabi" 
ignoring nonexistent directory "=/usr/arm-linux-gnueabi/include/c++/4.7.3/usr/include/arm-linux-gnueabi" 
ignoring nonexistent directory "=/usr/arm-linux-gnueabi/include/c++/4.7.3/usr/include" 
#include "..." search starts here: 
#include <...> search starts here: 
/usr/lib/gcc-cross/arm-linux-gnueabi/4.7/include 
/usr/lib/gcc-cross/arm-linux-gnueabi/4.7/include-fixed 
/usr/lib/gcc-cross/arm-linux-gnueabi/4.7/../../../../arm-linux-gnueabi/include 
End of search list. 
GNU C++ (Ubuntu/Linaro 4.7.3-12ubuntu1) version 4.7.3 (arm-linux-gnueabi) 
... 

這看起來像在由工具鏈中使用的內部通路的錯誤。在內置路徑中,請注意路徑中還有一個額外的/usr/arm-linux-gnueabi。 Bug提交給Ubuntu:g++-arm-linux-gnueabi cannot compile a C++ program with --sysroot

要解決的bug,到C的路徑++頭應明確與-I補充說:

  • /usr/arm-linux-gnueabi/include/c++/4.7.3
  • /usr/arm-linux-gnueabi/include/c++/4.7.3/arm-linux-gnueabi

沒有必要指定C和C++庫當與--sysroot鏈接時,因爲該選項正確處理它們。

所以編譯/鏈接命令將類似於:

/usr/bin/arm-linux-gnueabi-g++ ... -mcpu=cortex-m3 -mthumb \ 
    -I/usr/arm-linux-gnueabi/include/c++/4.7.3 \ 
    -I/usr/arm-linux-gnueabi/include/c++/4.7.3/arm-linux-gnueabi \ 
    --sysroot=/usr/arm-linux-gnueabi test.cpp -o test.exe