2017-09-26 67 views
1

我剛開始使用travis-CI,所以我很抱歉如果這是一個愚蠢或明顯的問題。Travis CI似乎是從錯誤的stdlib讀取

繼說明here

我寫了下面travis.yml

language: cpp 

dist: trusty 

matrix: 
    include: 
    - os: linux 
     compiler: gcc 
     addons: 
     apt: 
      sources: 
      - ubuntu-toolchain-r-test 
      packages: 
      - g++-7 
     env: 
     - MATRIX_EVAL="CC=gcc-7 && CXX=g++-7" 
    - os: linux 
     compiler: clang 
     addons: 
     apt: 
      sources: 
      - llvm-toolchain-trusty-5.0 
      packages: 
      - clang-5.0 
     env: 
     - MATRIX_EVAL="CC=clang-5.0 && CXX=clang++-5.0" 

before_install: 
    - eval "${MATRIX_EVAL}" 

script: 
    - mkdir build 
    - cd build 
    - cmake -DCMAKE_VERBOSE_MAKEFILE=ON .. 
    - cmake --build . 
    - ctest 

這將導致以下錯誤在鐺編譯:

/home/travis/build/FrancoisChabot/abulafia/./include/abulafia/support/type_traits.h:20:12: error: no member named 'decay_t' in namespace 'std'; did you mean 'decay'?

/usr/bin/../lib/gcc/x86_64-linux-gnu/4.8/../../../../include/c++/4.8/type_traits:1725:11: note: 'decay' declared here

當用下面的命令編譯:

cd /home/travis/build/FrancoisChabot/abulafia/build/tests/char_set && /usr/bin/clang++-5.0 -Wall -pedantic -Wextra -std=c++17 -I/home/travis/build/FrancoisChabot/abulafia/./include -I/home/travis/build/FrancoisChabot/abulafia/googletest/googletest/include -o CMakeFiles/char_set_tests.dir/test_any.cpp.o -c

這告訴我它正在加載gcc的庫。我在這裏有什麼不瞭解的嗎?

link to the full log如果有什麼重要的我ommited。

謝謝!

回答

3

是的,這是Travis-ci構建環境中的一個衆所周知的問題。它正在編譯並鏈接到默認的ubuntu-trusty libstdc++,這是gcc 4系列stdlib,甚至不符合C++ 11標準。

請參閱an issue很久以前我打開了。

如果您需要帶有travis-ci的C++ 14 libstdc++,您應該使用docker並創建一個更新的ubuntu映像。這是最好的解決方法AFAIK。

+0

但是我的gcc 7 build在C++ 17中工作正常,所以必須有一種方法來獲得正確的lib而不需要製作一個全新的docker鏡像。 – Frank

+0

沒錯,你有gcc 7編譯器,並且你正在啓用C++ 17,但它正在從操作系統讀取'libstdC++'頭文件和所以文件,所以你會得到一個非常棒的C++ 17/C++ 03建立。它這樣做是因爲它知道你可能有一些外部依賴。任何來自apt-get和需要'libstdC++'的依賴將需要gcc-4系列'libstdC++',並且您將無法一次鏈接到兩個版本的'libstdC++'。如果你的項目有任何你使用'apt-get'滿足的依賴關係,你最好的選擇就是使用docker鏡像。 –

+0

如果您從源代碼構建整個編譯器和標準庫,則可以在您的主目錄中配置編譯器以使用該版本的stdlib,並製作需要該版本stdlib的程序。但是你可以從ubuntu的ppa中得到的gcc-5不會那樣,因爲它對運行可靠的任何人都沒有用處。他們將被設置爲使用可靠的stdlib並在可靠的方面製作有用的程序。歸結起來,如果可靠版本的'libstdC++'不適合你,那麼你應該使用docker。 –