2017-02-19 98 views
0

我發生了一些非常奇怪的情況:CMake未能選擇正確版本的g ++ 只有如果我第一次編譯項目(或者我刪除'build'文件夾) 。CMake無法識別新版本中的C++編譯器版本

因此,使用auto時,'新鮮'編譯會帶來錯誤,但如果我再次編譯它,一切都會順利進行(直到我刪除'build'文件夾)。

在這裏,你是我的文件:

的CMakeLists.txt

file(GLOB_RECURSE SOURCES 
    include/*.h 
    src/*.cpp 
) 

SET(CMAKE_CXX_FLAGS "-std=c++14") 

set(filename $ENV{env_filename}) 

cmake_minimum_required(VERSION 2.8) 
project(filename) 
add_executable(${filename} ${filename}.cpp ${SOURCES}) 

compile.sh

#!/bin/bash 
clear 
set -e 
source filedata.txt 
export env_filename=$filename 
mkdir -p build && cd build 
cmake .. &> /dev/null 
make -B 
./$filename 

filedata.txt

filename="1_Example" 

在此先感謝,

愛德華

+0

我真的不明白爲什麼你需要這個shell腳本開始。 –

+0

@BaummitAugen能夠使用簡單的'./ compile.sh'編譯和運行一個文件,而不用擔心它的名字。 – eduherminio

回答

1

真的不能幫你實際的錯誤,但是......

爲何使用設置-e?你不應該跳過錯誤,你應該修復它們...

你的CMakeLists.txt也是錯誤的結構。你應該在第一行有:

cmake_minimum_required(VERSION 2.8) 
project(filename) 

否則它被認爲是不正確的。它可能工作,但它不應該。在運行CMake命令之前,您必須指定運行該文件所需的版本。

您的SOURCES條目應該有雙引號。

UPDATE

原來把cmake_minimum_requirement(VERSION 2.8)第一固定它的OP。在那之後,CMake在結構上不需要太多的東西,你可以用其他常識來理解,但首先要有版本要求是必須的。

+0

mm如果任何後續命令失敗,我正在使用'set -e'來退出shell腳本。 是否可以在'set(filename $ ENV {env_filename})'之前放置'project(filename)'? – eduherminio

+0

哦,對了,忘記了設置-e的作品與我一直認爲的相反......大聲笑。不,它不是,但我99.9999%肯定你可以直接使用項目($ ENV {env_filename}),而不是通過創建一個不必要的變量。 –

+0

用'add_executable($ ENV {env_filename} $ ENV {env_filename} .cpp $ {SOURCES})'替換'add_executable($ {filename} $ {filename} .cpp $ {SOURCES})''' 閱讀env是否值得?變量三次而不是創建一個變量? – eduherminio