包含来自另一个文件的函数会导致范围错误 (openFoam)

Posted

技术标签:

【中文标题】包含来自另一个文件的函数会导致范围错误 (openFoam)【英文标题】:Including function from another file gives scope error (openFoam) 【发布时间】:2018-08-13 03:45:17 【问题描述】:

这个问题是关于 openFoam (foam extend v4) C++ 但我相信我遇到的问题是一个基本的 C++ 编程问题。

我正在尝试使用函数autoCreateOmega,其原型可以在

foam-extend-4.0/src/turbulenceModels/incompressible/RAS/lnInclude/backwardsCompatibilityWallFunctions.H,定义在对应的backwardsCompatibilityWallFunctions.C中。

在我的solver.C 文件中,顶部有以下内容:

#include "fvCFD.H"
#include "simpleControl.H"
#include "wallDist.H"
#include "backwardsCompatibilityWallFunctions.H"
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //

int main(int argc, char *argv[])

#   include "setRootCase.H"
#   include "createTime.H"
#   include "createMesh.H"

    simpleControl simple(mesh);

#   include "createFields.H"

我的createFields.H 的一部分看起来像这样:

    Info<< "Reading field omega\n" << endl;


    volScalarField omega
    (
        IOobject
        (
            "omega",
            runTime.timeName(),
            mesh,
            IOobject::MUST_READ,
            IOobject::AUTO_WRITE
        ),
        //mesh
        autoCreateOmega("omega", mesh, U.db())
    );

当我尝试编译此求解器时,出现以下错误:

In file included from solver.C:48:0:
 createFields.H: In function ‘int main(int, char**)’:
createFields.H:50:46: error: ‘autoCreateOmega’ was not declared in this scope
         autoCreateOmega("omega", mesh, U.db())
                                              ^
createFields.H:50:46: note: suggested alternative:
In file included from solver.C:37:0:
/home/foam/foam-extend-4.0/src/turbulenceModels/incompressible/RAS/lnInclude/backwardsCompatibilityWallFunctions.H:98:25: note:   ‘Foam::incompressible::autoCreateOmega’
     tmp<volScalarField> autoCreateOmega
                         ^
solver.dep:714: recipe for target 'Make/linux64GccDPOpt/solver.o' failed
make: *** [Make/linux64GccDPOpt/solver.o] Error 1

为什么不包括"backwardsCompatibilityWallFunctions.H" 允许我在我的程序中使用autoCreateOmega?非常感谢任何帮助。

如果需要更多信息,请告诉我。

编辑

"backwardsCompatibilityWallFunctions.H":

#ifndef backwardsCompatibilityWallFunctions_H
#define backwardsCompatibilityWallFunctions_H

#include "fvMesh.H"

// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //

namespace Foam

namespace incompressible



//- omega
tmp<volScalarField> autoCreateOmega
(
    const word& fieldName,
    const fvMesh& mesh,
    const objectRegistry& obj
);

tmp<volScalarField> autoCreateOmega
(
    const word& fieldName,
    const fvMesh& mesh
);

"backwardsCompatibilityWallFunctions.C"

tmp<volScalarField> autoCreateOmega
(
    const word& fieldName,
    const fvMesh& mesh,
    const objectRegistry& obj
)

    return
        autoCreateWallFunctionField
        <
            scalar,
            RASModels::omegaWallFunctionFvPatchScalarField
        >
        (
            fieldName,
            mesh,
            obj
        );



tmp<volScalarField> autoCreateOmega
(
    const word& fieldName,
    const fvMesh& mesh
)

    return
        autoCreateWallFunctionField
        <
            scalar,
            RASModels::omegaWallFunctionFvPatchScalarField
        >
        (
            fieldName,
            mesh,
            mesh
        );

如建议:如果我添加using Foam::incompressible::autoCreateOmega;

Make/linux64GccDPOpt/solver.o: In function `main':
solver.C:(.text.startup+0x7dd): undefined reference to `Foam::incompressible::autoCreateOmega(Foam::word const&, Foam::fvMesh const&, Foam::objectRegistry const&)'
collect2: error: ld returned 1 exit status
/home/foam/foam-extend-4.0/wmake/Makefile:159: recipe for target '/home/foam/applications/bin/linux64GccDPOpt/solver' failed
make: *** [/home/foam/applications/bin/linux64GccDPOpt/solver] Error 1

【问题讨论】:

【参考方案1】:

由于编译器通知了未声明的函数,而不是模棱两可的调用,最可能的原因是函数名放置在某个命名空间中。我查看了扩展的 OpenSOAP 源代码,建议您在 main 之前插入 using Foam::incompressible::autoCreateOmega;

【讨论】:

感谢您的输入,但是头文件中有两个实现,一个接受两个参数,另一个接受三个参数。请让我知道在源代码方面我还能提供什么! 你可能会使用非官方的 OpenFOAM 库。 是的,我正在使用foam-extend-v4 分支。然而,问题更多在于基本的 C++ 错误。 你已经前进了。现在编译成功但链接器失败。您不向链接器提供 OpenFOAM 库。这是另一个问题。看***.com/questions/12573816/… 那么我如何找出我需要包含的库?我假设我需要将它添加到我的 Make/options 文件中,但据我所知,我已经添加了所有内容。我认为这是因为 autoCreateOmega 被湍流模型类使用,并且我已经复制了该编译所需的所有库。

以上是关于包含来自另一个文件的函数会导致范围错误 (openFoam)的主要内容,如果未能解决你的问题,请参考以下文章

“架构 x86_64 的未定义符号”试图包含来自另一个文件的函数

向量下标超出范围错误 - C++ Vectors & Open CV

PHP open_basedir配置未包含upload_tmp_dir 导致服务器不能上传文件

链接来自另一个文件的函数时,Qt 上出现错误 LNK 2019 [重复]

python open函数的坑

Javascript导入另一个js文件导致程序失败