如何使用OpenModelica(linux)中的外部函数调用CoolProps共享库中的函数?使用 Fortran-77 包装器没有成功

How to use external functions in OpenModelica(linux) to call a function in the CoolProps Shared Library? Using a Fortran-77 wrapper didnt work out

提问人:aahliffe 提问时间:4/28/2022 最后编辑:aahliffe 更新时间:4/29/2022 访问量:125

问:

我在 CoolProp Sources 中试用了 Fortran Wapper

包装器中给出的示例 fortran 代码使用 CoolProp 中的函数 PropsSI。

double precision T,Q,D,h,s,P
      character(LEN=32) Ref,Output, Name1, Name2
      double precision outVal,Prop1,Prop2

      integer inte

      T = 400
      Q = 1;

      Output = "D"//CHAR(0)
      Name1  = "Q"//CHAR(0)
      Prop1  = Q
      Name2  = "T"//CHAR(0)
      Prop2  = T
      Ref    = "IF97::Water"//CHAR(0)
      outval = 9999999  


      call PropsSi(Output, Name1, Prop1, Name2, Prop2, Ref, outVal)

我按照以下步骤在Modelica中调用上述函数:

  1. 构建了一个静态 Coolprop 库:在 CoolProp 的根目录下(也在我自己的软件包存储库中尝试过),我使用以下代码构建了一个静态库:
mkdir build && cd build
mkdir gccstatic && cd gccstatic
cmake ../..  -DCOOLPROP_STATIC_LIBRARY=ON -DCOOLPROP_EXTERNC_LIBRARY=ON -DCMAKE_VERBOSE_MAKEFILE=ON
cmake --build .

然后,代码中生成的库被移动到 modelica 包存储库中

  1. 将 fortran 文件链接到 Coolprop 共享库 libCoolProp.a。使用了多种方法,但逻辑是相同的:
f77 main.f -L. -lCoolProp

  1. 在 modelica 中使用 external 关键字调用函数
function propssi
  extends Modelica.Icons.Function;
  input Real T;
  input Real Q;
  output Real D;
  protected 
  String out = "D";
  String n1 = "Q";
  String n2 = "T";
  String ref= "IF97::Water";

  external "FORTRAN 77" D = PropsSI(out, n1, Q, n2, T, ref) annotation(Library = {"testfunction"});
end propssi;

在以多种变体执行此操作后,我从 modelica 收到一个我无法弄清楚的编译错误。

/usr/bin/ld: /usr/local/lib/libCoolProp.a(CoolPropLib.cpp.o): 对符号“_ZTVN10__cxxabiv121__vmi_class_type_infoE@@CXXABI_1.3”的未定义引用 /usr/bin/ld:/lib/x86_64-linux-gnu/libstdc++.so.6:添加符号时出错:命令行中缺少 DSO clang:错误:链接器命令失败,退出代码为 1(使用 -v 查看调用) make: *** [UseFortran.makefile:37: omc_main_target] 错误 1 编译过程失败。退出,代码为 2。

任何人都可以建议替代方法来访问 coolprop 库函数或正确调用现有的 fortran 示例代码

Fortran G++ Clang Linker-Errors OpenModelica

评论

0赞 veryreverie 4/28/2022
这回答了你的问题吗?什么是未定义的引用/未解析的外部符号错误,如何在 Fortran 中修复它?
0赞 veryreverie 4/28/2022
是在 中定义的,还是在其他地方定义的依赖项?您可以使用此方法找出答案。_ZTVN10...my_libmy_lib
0赞 veryreverie 4/28/2022
另外,你说你链接到 ,但你的标志是 .我很困惑。libCoolProp.a-lmy_lib
1赞 Vladimir F Героям слава 4/28/2022
这个东西看起来像是来自 C++ 类的东西,而不是来自 Fortran。你是混在一起的吗?您是否以支持的方式执行此操作?您需要显示生成错误消息的确切命令。考虑使用不同的标签来吸引合适的专家。这个缺失的符号实际上不是来自 Fortran,而是来自 C++。查看 stackoverflow.com/questions/12573816/..._ZTVN10__cxxabiv121__vmi_class_type_infoE...g++clang
0赞 aahliffe 4/29/2022
@VladimirF Героямслава感谢您的回复:D这是我在这里的第一个问题,所以请原谅标签。我提到的 coolprop 源代码是一个预编译的 c++ 库。我尝试使用 fortran 代码调用的函数就在其中。我不完全了解 modelica 编译器使用的混合中的 g++ 和 clang 函数

答: 暂无答案