0

私たちのチームは、科学的な C++ ライブラリの新しいリリースに取り組んでいます。ただし、MacOS Catalina で CMake にブーストを含めようとすると、全体を理解できない問題が発生しました。

まず、問題について詳しく説明します。最後に、私の理解から問題を要約した最小限の実例を提供します。

全体像の目標

私たちの大きな目標は、ソフトウェア パッケージでブースト ライブラリを使用することです。そのために、CMakeFile 内でB2を使用します。私たちはこのファイルboost.cmakeに基づいています。この問題は、 を呼び出すときにすでに発生しています。bootstrap.sh

問題

B2 は、ローカル コンパイラが単純な c++11 ファイルを実行できるかどうかをチェックします (これは で発生しbuild.sh、実行された cxx ファイルは ですcheck_cxx11.cpp)。これは、Linux システムでそのまま使用できるようです。ただし、macOS Catalina では、次のものが見つからないために失敗します<wchar.h>

In file included from check_cxx11.cpp:14:
In file included from /Library/Developer/CommandLineTools/usr/bin/../include/c++/v1/thread:86:
In file included from /Library/Developer/CommandLineTools/usr/bin/../include/c++/v1/iosfwd:95:
/Library/Developer/CommandLineTools/usr/bin/../include/c++/v1/wchar.h:118:15: fatal error: 'wchar.h' file not found
#include_next <wchar.h>

ただし、端末から clang++ または g++ を使用して cpp の例をコンパイルすると、エラーは発生しません。

この問題は、CMake によってCXX設定された環境変数が原因であることがわかりました(既に行で)。/Library/Developer/CommandLineTools/usr/bin/c++project(test LANGUAGES CXX)

CXXCMakeを呼び出す前に未定義の場合、エラーが発生します。Cmakeを実行する前にエクスポートCXX=/usr/bin/clang++すると、同じエラーが発生します。ただし、エクスポートするCXX=/usr/bin/g++と、すべて正常に動作します

再現性

CMake と xcode のみがインストールされている macOS Catalina (10.15.7) のクリーン インストールでこの問題を再現できたので、これは私のマシンだけの問題ではなく、少なくともこの特定の OSX バージョン。

最小限の (ない) 作業例

この問題がCXX変数に関連していることがわかったので、この問題を要約する最小限の実例を作成しました。

私のCMakeLists.txtは次のようになります。

cmake_minimum_required(VERSION 3.14.3)
project(test LANGUAGES CXX)

list(APPEND CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR})
include(boost)

ブースト.cmake :

message(STATUS "CXX: " $ENV{CXX})

execute_process(COMMAND sh ${CMAKE_CURRENT_SOURCE_DIR}/build_file.sh $ENV{CXX}
                WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR})

build_shell.sh :

$1 -x c++ -std=c++11 check_cxx11.cpp

check_cxx11.cpp:

#include <thread>

int main()
{
    // Check for basic thread calls.
    { auto _ = std::thread::hardware_concurrency(); }
}

CXXcmake を実行する前にエクスポートしないと、出力は次のようになります。

-- CXX: /Library/Developer/CommandLineTools/usr/bin/c++

コードは失敗します。

エクスポートするCXX=/usr/bin/clang++と、出力は

-- CXX: /Library/Developer/CommandLineTools/usr/bin/clang++

コードは失敗します。

エクスポートするCXX=/usr/bin/g++と、出力は

-- CXX: /Library/Developer/CommandLineTools/usr/bin/g++

そしてコードは機能します。

質問

なぜこれが起こるのかを理解したいと思います: CMake がCXX変数を (明らかに) 間違ったものに変更するのはなぜですか? コードが g++ では機能するのに、clang++ では機能しないのはなぜですか?

インストール プロセスは、環境変数をエクスポートする必要なく、MacOS ユーザーにとってすぐに使用できるはずです。この問題を解決するには、何らかの方法でコードを機能させるためだけに何かをハードコーディングするのではなく、問題を理解する必要があります。

4

0 に答える 0