Clang/C++11 を使う2016年11月18日 | |
はじめにOpenFOAM で Clang/C++11 を使う。 使用バージョンOpenFOAM 4.1 (Ubuntu バイナリ版) セットアップOpenFOAM で Clang を使う場合、ソースからコンパイルするのが筋だろうが、時間がかかるので、ここではバイナリ版の設定を修正する。 $WM_PROJECT_DIR/etc/bashrc #export WM_COMPILER=Gcc export WM_COMPILER=Clang $WM_PROJECT_DIR/wmake/rules/linux64Clang/c++ #c++WARN = -Wall -Wextra -Wold-style-cast -Wnon-virtual-dtor -Wno-unused-parameter -Wno-invalid-offsetof -Wno-c++11-extensions c++WARN = -Wall -Wextra -Wold-style-cast -Wnon-virtual-dtor -Wno-unused-parameter -Wno-invalid-offsetof -Wno-c++11-extensions -Wno-unused-comparison ... #c++FLAGS = $(GFLAGS) $(c++WARN) $(c++OPT) $(c++DBUG) $(ptFLAGS) $(LIB_HEADER_DIRS) -fPIC c++FLAGS = $(GFLAGS) $(c++WARN) $(c++OPT) $(c++DBUG) $(ptFLAGS) $(LIB_HEADER_DIRS) -fPIC -std=c++11 "c++WARN" に "-Wno-unused-comparison"、"c++FLAGS" に "-std=c++11" を追加している。以前のバージョンでははじめから "-Wno-unused-comparison" が入っていたので、これがあると問題があると判断されたのかもしれない。 バイナリを Clang 用にコピーする。 $ cd $WM_PROJECT_DIR/platforms $ sudo cp -r linux64GccDPOpt linux64ClangDPOpt $ cd $WM_PROJECT_DIR/wmake/platforms $ sudo cp -r linux64Gcc linux64Clang コンパイルエラーの比較potentialFoam でコンパイルエラーの違いを確認してみる。 createFields.H
volScalarField p
(
IOobject
(
pName,
runTime.timeName(),
mesh,
IOobject::READ_IF_PRESENT,
IOobject::NO_WRITE
)
//),
//mesh,
//dimensionedScalar(pName, sqr(dimVelocity), 0),
//pBCTypes
);
Gcc, Clang 双方のバイナリがある状態なので、双方のコンパイラを切り替えられる。Gcc に切り替える場合は次のようにする。 $ WM_COMPILER=Gcc Gcc によるエラー。
$ wmake
...
In file included from potentialFoam.C:81:0:
createFields.H: In function ‘int main(int, char**)’:
createFields.H:73:1: error: no matching function for call to ‘Foam::GeometricField<double, Foam::fvPatchField, Foam::volMesh>::GeometricField(Foam::IOobject)’
);
^
createFields.H:73:1: note: candidates are:
In file included from /opt/openfoam4/src/OpenFOAM/lnInclude/GeometricField.H:651:0,
from /opt/openfoam4/src/OpenFOAM/lnInclude/GeometricScalarField.H:38,
from /opt/openfoam4/src/OpenFOAM/lnInclude/GeometricFields.H:34,
from /opt/openfoam4/src/finiteVolume/lnInclude/volFields.H:37,
from /opt/openfoam4/src/finiteVolume/lnInclude/surfaceInterpolationScheme.C:27,
from /opt/openfoam4/src/finiteVolume/lnInclude/surfaceInterpolationScheme.H:304,
from /opt/openfoam4/src/finiteVolume/lnInclude/surfaceInterpolate.H:41,
from /opt/openfoam4/src/finiteVolume/lnInclude/fvc.H:39,
from /opt/openfoam4/src/finiteVolume/lnInclude/fvCFD.H:8,
from potentialFoam.C:37:
/opt/openfoam4/src/OpenFOAM/lnInclude/GeometricField.C:663:1: note: Foam::GeometricField<Type, PatchField, GeoMesh>::GeometricField(const Foam::IOobject&, const Foam::tmp<Foam::GeometricField<Type, PatchField, GeoMesh> >&, const wordList&, const wordList&) [with Type = double; PatchField = Foam::fvPatchField; GeoMesh = Foam::volMesh; Foam::wordList = Foam::List<Foam::word>]
Foam::GeometricField<Type, PatchField, GeoMesh>::GeometricField
^
/opt/openfoam4/src/OpenFOAM/lnInclude/GeometricField.C:663:1: note: candidate expects 4 arguments, 1 provided
/opt/openfoam4/src/OpenFOAM/lnInclude/GeometricField.C:620:1: note: Foam::GeometricField<Type, PatchField, GeoMesh>::GeometricField(const Foam::IOobject&, const Foam::GeometricField<Type, PatchField, GeoMesh>&, const wordList&, const wordList&) [with Type = double; PatchField = Foam::fvPatchField; GeoMesh = Foam::volMesh; Foam::wordList = Foam::List<Foam::word>]
Foam::GeometricField<Type, PatchField, GeoMesh>::GeometricField
^
...
/opt/openfoam4/src/OpenFOAM/lnInclude/GeometricField.C:200:1: note: candidate expects 5 arguments, 1 provided
/opt/openfoam4/src/OpenFOAM/lnInclude/GeometricField.C:176:1: note: Foam::GeometricField<Type, PatchField, GeoMesh>::GeometricField(const Foam::IOobject&, const Mesh&, const Foam::dimensionSet&, const Foam::word&) [with Type = double; PatchField = Foam::fvPatchField; GeoMesh = Foam::volMesh; Foam::GeometricField<Type, PatchField, GeoMesh>::Mesh = Foam::fvMesh]
Foam::GeometricField<Type, PatchField, GeoMesh>::GeometricField
^
/opt/openfoam4/src/OpenFOAM/lnInclude/GeometricField.C:176:1: note: candidate expects 4 arguments, 1 provided
make: *** [Make/linux64ClangDPInt32Opt/potentialFoam.o] エラー 1
Clang によるエラー。
In file included from potentialFoam.C:81:
./createFields.H:59:16: error: no matching constructor for initialization of
'volScalarField' (aka 'GeometricField<scalar, fvPatchField,
Foam::volMesh>')
volScalarField p
^
/opt/openfoam4/src/OpenFOAM/lnInclude/GeometricField.H:367:9: note: candidate
constructor not viable: no known conversion from 'Foam::IOobject' to
'const GeometricField<double, fvPatchField, Foam::volMesh>' for 1st
argument
GeometricField
^
/opt/openfoam4/src/OpenFOAM/lnInclude/GeometricField.H:374:9: note: candidate
constructor not viable: no known conversion from 'Foam::IOobject' to
'const tmp<GeometricField<double, fvPatchField, Foam::volMesh> >' for 1st
argument
GeometricField
...
/opt/openfoam4/src/OpenFOAM/lnInclude/GeometricField.H:305:9: note: candidate
constructor not viable: requires at least 4 arguments, but 1 was provided
GeometricField
^
1 error generated.
make: *** [Make/linux64ClangDPInt32Opt/potentialFoam.o] エラー 1
Clang のほうがいくらかすっきりしている。 C++11 のテスト同じく potentialFoam で、C++11 のコードを書いてみる。 まず、従来のコード。 const volScalarField::Boundary &bf = p.boundaryField(); Info<< bf.types() << endl; 上記を、C++11 では次のように簡単に書ける。 auto &bf = p.boundaryField(); Info<< bf.types() << endl; | |
| PENGUINITIS | |