2016-11-07 6 views
0

質問概要。コードがcmakeで正常に構築され、外部プロジェクトとして追加されたときに失敗する

私はCMakeを使ってビルドしたプロジェクトAを持っています。これはきれいにコンパイルされます。

私はcmakeののExternalProject_Addコマンドを使用して別のプロジェクトBに引っ張ったときに、それは私が得るエラーの種類建物A.

の地点に到達したときただし、コンパイルは失敗します。それは(再び、ExternalProject_Addによってもたらされる)Aをコンパイル開始時にBをコンパイル

はこの

warning: rvalue references are a C++11 extension [-Wc++11-extensions] 

ようなエラーを与えます。

-std=c++11は、関連するすべてのCMakeList.txtファイルに設定されています。

私はExternalProject_Addを使用してGoogleプロジェクトも実行していますが、問題は発生しません。

CMakeLists.txtファイルにはいくつかの特徴があります。

次の抜粋は、AのCMakeLists.txtからです:

# Use the C++11 standard. 
set (CC_FLAGS "-std=c++11") 

# Figure out the warning flags to use. 
CHECK_CXX_COMPILER_FLAG("-pedantic-errors" SUPPORTS_PEDANTIC_ERRORS) 
CHECK_CXX_COMPILER_FLAG("-Wall" SUPPORTS_WALL) 
CHECK_CXX_COMPILER_FLAG("-Wextra" SUPPORTS_WEXTRA) 

if (SUPPORTS_PEDANTIC) 
    set (CC_FLAGS "${CC_FLAGS} -pedantic") 
endif() 

# [omitted]... similarly for the rest of the flags. 

set (CMAKE_CXX_FLAGS_RELEASE "-O3 ${CC_FLAGS}") 
set (CMAKE_CXX_FLAGS_DEBUG "-O0 -g ${CC_FLAGS}") 

次はBのCMakeLists.txtからです。異なる部分はアスタリスク(*)の後に来ます。 デフォルトCMAKE_BUILD_TYPEことで

# Use the C++11 standard. 
set (CC_FLAGS "-std=c++11") 

# Figure out the warning flags to use. 
CHECK_CXX_COMPILER_FLAG("-pedantic-errors" SUPPORTS_PEDANTIC_ERRORS) 
CHECK_CXX_COMPILER_FLAG("-Wall" SUPPORTS_WALL) 
CHECK_CXX_COMPILER_FLAG("-Wextra" SUPPORTS_WEXTRA) 

if (SUPPORTS_PEDANTIC) 
    set (CC_FLAGS "${CC_FLAGS} -pedantic") 
endif() 

# [omitted]... similarly for the rest of the flags. 

set (CMAKE_CXX_FLAGS_RELEASE "-O3 ${CC_FLAGS}") 
set (CMAKE_CXX_FLAGS_DEBUG "-O0 -g ${CC_FLAGS}") 

# ************* DIFFERS HERE ************ 

ExternalProject_Add (
    projectA 

    PREFIX "${projectA_prefix}" 
    GIT_REPOSITORY "[omitted]" 

    INSTALL_COMMAND "" 
) 

ExternalProject_Add (
    google_benchmark 

    PREFIX "${GoogleBenchmarkPrefix}" 
    GIT_REPOSITORY "https://github.com/google/benchmark.git" 

    UPDATE_COMMAND "" 

    BUILD_COMMAND make benchmark 
    INSTALL_COMMAND "" 
) 
+1

だから、プロジェクトAは何の' -std = C++ '11セットを持っていません。おそらく、この場合、プロジェクトにはRELEASEまたはDEBUG以外のビルドタイプがあります。 – Tsyvarev

+0

これは初心者の質問かもしれませんが、ExternalProject_Addによって、追加されたプロジェクトがcmakeで設定されるのではないのですか?また、外部プロジェクトには独自のCMakeLists.txtがあり、-std = C++ 11と設定すると十分ではありませんか? – dow

+0

@Tsyvarev CMAKE_ARGSを追加しました。-DCMAKE_BUILD_TYPE = ExternalProject_Addパートにリリースされました。 あなたが明確な回答(コメントではない)としてアドバイスを書くなら、私はそれを受け入れることができます。ありがとう! – dow

答えて

1

ので、すべての構成固有の設定が省略され、です。

あなたのCMAKE_CXX_FLAGS_*変数はどれも使用されないため、プロジェクトはc++11なしで構築されます。

例外がで最適化されたtarget_link_librariesためキーワード:it works任意の非デバッグの設定に対応して。

には、プロジェクトのデフォルトのビルドタイプを指定することをお勧めします。 This postは、その目的のために素敵なテンプレートを示唆:ExternalProject_Add` `経由して構築されたとき

# Set a default build type if none was specified 
if(NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES) 
    message(STATUS "Setting build type to 'Debug' as none was specified.") 
    set(CMAKE_BUILD_TYPE Debug CACHE STRING "Choose the type of build." FORCE) 
    # Set the possible values of build type for cmake-gui 
    set_property(CACHE CMAKE_BUILD_TYPE PROPERTY STRINGS "Debug" "Release" 
    "MinSizeRel" "RelWithDebInfo") 
endif()