2016-08-30 52 views
4

(Ubuntu的16.04.1)鏘++ --gcc工具鏈和gcc 4.9.3鏈接問題

默認情況下,在16.04.1鐺是採摘gcc的工具鏈5.4。不幸的是,我有一個庫,要求 5.0之前ABI 我沒有訪問來源,實施者也沒有發佈一個新版本。我一直在嘗試使用 - gcc-toolchain選項,但我無法讓它正常工作。 (ctrbegin.o和crtend.o不要在鏈接正確的前綴。)

$ clang++-3.8 -v -print-search-dirs 

clang version 3.8.0-2ubuntu4 (tags/RELEASE_380/final) 
Target: x86_64-pc-linux-gnu 
Thread model: posix 
InstalledDir: /usr/bin 
Found candidate GCC installation: /usr/bin/../lib/gcc/i686-linux-gnu/5.4.0 
Found candidate GCC installation: /usr/bin/../lib/gcc/i686-linux-gnu/6.0.0 
Found candidate GCC installation: /usr/bin/../lib/gcc/x86_64-linux-gnu/4.9 
Found candidate GCC installation: /usr/bin/../lib/gcc/x86_64-linux-gnu/4.9.3 
Found candidate GCC installation: /usr/bin/../lib/gcc/x86_64-linux-gnu/5.4.0 
Found candidate GCC installation: /usr/bin/../lib/gcc/x86_64-linux-gnu/6.0.0 
Found candidate GCC installation: /usr/lib/gcc/i686-linux-gnu/5.4.0 
Found candidate GCC installation: /usr/lib/gcc/i686-linux-gnu/6.0.0 
Found candidate GCC installation: /usr/lib/gcc/x86_64-linux-gnu/4.9 
Found candidate GCC installation: /usr/lib/gcc/x86_64-linux-gnu/4.9.3 
Found candidate GCC installation: /usr/lib/gcc/x86_64-linux-gnu/5.4.0 
Found candidate GCC installation: /usr/lib/gcc/x86_64-linux-gnu/6.0.0 
Selected GCC installation: /usr/bin/../lib/gcc/x86_64-linux-gnu/5.4.0 
Candidate multilib: .;@m64 
Selected multilib: .;@m64 
programs: =/usr/bin:/usr/lib/llvm-3.8/bin:/usr/bin/../lib/gcc/x86_64-linux-gnu/5.4.0/../../../../x86_64-linux-gnu/bin 

libraries: =/usr/lib/llvm-3.8/bin/../lib/clang/3.8.0: 
/usr/bin/../lib/gcc/x86_64-linux-gnu/5.4.0: 
/usr/bin/../lib/gcc/x86_64-linux-gnu/5.4.0/../../../x86_64-linux-gnu: 
/lib/x86_64-linux-gnu: 
/lib/../lib64: 
/usr/lib/x86_64-linux-gnu: 
/usr/bin/../lib/gcc/x86_64-linux-gnu/5.4.0/../../..: 
/usr/lib/llvm-3.8/bin/../lib: 
/lib: 
/usr/lib 

當我嘗試指定--gcc工具鏈,鐺似乎接受,那麼完全忽略值。 (同樣的事情發生在16.04.1的鏗鏘++ - 3.5上。)

這是正確的語法嗎?請注意,輸出中缺少庫目錄。

$ clang++-3.8 -v --gcc-toolchain=/usr/bin/../lib/gcc/x86_64-linux-gnu/4.9.3 -print-search-dirs 

clang version 3.8.0-2ubuntu4 (tags/RELEASE_380/final) 
Target: x86_64-pc-linux-gnu 
Thread model: posix 
InstalledDir: /usr/bin 
programs: =/usr/bin:/usr/lib/llvm-3.8/bin:/..//bin 

libraries: =/usr/lib/llvm-3.8/bin/../lib/clang/3.8.0:/lib/x86_64-linux-gnu:/lib/../lib64:/usr/lib/x86_64-linux-gnu:/usr/lib/llvm-3.8/bin/../lib:/lib:/usr/lib 

我已經嘗試了上述主題的許多變化。 (4.9,刪除相對路徑等)我試過了-isystem選項和-cxx-isystem選項。 (這兩個建議解決類似的問題。)

我在想什麼?(我希望它很簡單,並且頭腦非常好!)

+0

您是否找到解決方案?我也在處理一個非常類似的問題。 – antosecret

+0

我不得不快速的工作,所以我提出了叮鐺聲,直到我們可以得到同一ABI下的所有項目。現在我恢復了GCC,直到我有機會再次處理工具鏈問題。 – ErnieE

回答

0

看起來你錯過了一個錯誤路徑--gcc-toolchain選項。它預計GCC安裝前綴的路徑是/usr,如果GCC安裝了包管理器。但是,如果您的系統中安裝了多個GCC版本並且它們都具有相同的前綴,我認爲不可能選擇使用什麼工具鏈。似乎clang只需要$PREFIX/lib/gcc/x86_64-linux-gnu目錄中的最新版本。所以,我建議您自己構建您需要的工具鏈,並將安裝前綴傳遞給--gcc-toolchain選項。

0

不幸的是我有需要先行5.0 ABI和我沒有到源

你不需要切換GCC工具鏈改變ABI作爲新版本的GCC訪問的庫有dual-abi的支持。

要切換ABI重寫預處理宏:

clang++ -D_GLIBCXX_USE_CXX11_ABI=0 

所以,我建議你建立你需要自己的工具鏈,並通過安裝前綴--gcc工具鏈選項。

如果它是可用的,你可能想要通過模仿你的/ usr文件夾通過符號鏈接來使用你選擇的工具鏈,同時排除你不需要的gcc版本。

0

由於Gaetano在鏈接票中寫道,您需要建立一個單獨的目錄,可以傳遞給叮噹的--gcc-toolchain。這是我稍微改進的代碼。不需要bininclude鏈接。

# The libstdc++ version you want to use 
libstdcxx_version="4.9" 
# Avoid calling arch twice 
arch="$(arch)" 
# The new toolchain root in the current directory 
toolchain_root="$(pwd)/toolchain" 
# The gcc library directory to be created 
toolchain_gcc="$toolchain_root/lib/gcc/$arch-linux-gnu" 
# Create that directory 
mkdir -p "$toolchain_gcc" 
# Find the longest matching libstdc++ version. 
# Needed for clang-3.8 and older - they need 4.9.x rather than 4.9. 
libstdcxx_dir=$(ls -d /usr/lib/gcc/$arch-linux-gnu/${libstdcxx_version}* \ 
    | tail -1) 
# Link the libstdc++ library directory to the new location 
ln -sfn "$libstdcxx_dir" "$toolchain_gcc/" 
# Now you can add "--gcc-toolchain=$toolchain_root" to the clang flags