【问题标题】:External functions: Calling a C script that use external Library外部函数:调用使用外部库的 C 脚本
【发布时间】:2020-06-29 01:52:13
【问题描述】:

我试图在我的 Modelica 模型中调用使用 GLPK(GNU 线性编程工具包)的外部 C 代码。 C 代码工作得很好,已经在所有输入都是自供的独立模式下对其进行了测试。当我尝试将它与我的 Modelica 模型链接时,它开始给我链接器类型错误,类似于以下内容:

examples.SimpleSystemOptimalDispatch_functions.c:(.text+0x99d): undefined reference to `glp_set_row_bnds'

我注意到要在独立模式下运行 C 代码,必须使用特殊的链接器

gcc standalonecode.c -lglpk -o standalone

我认为问题出在链接过程中,但我不知道如何告诉 Modelica 自动进行链接。知道如何在 Modelica 中解决这个链接问题吗?

谢谢你和最良好的祝愿

【问题讨论】:

    标签: c modelica openmodelica


    【解决方案1】:

    您没有使用特殊的链接器。 -lglpk 只是告诉链接器将您的可执行文件与glpk 库(libglpk)链接。

    现在,Modelica 有一个可用性问题——其中很多——事实上,没有简单的方法可以告诉 Modelica“这是我的 C 文件,这是我需要的动态库,试试看”只是一个预兆未来更糟糕的事情。

    你需要做的是将你的代码编译成一个动态库,然后这个动态库会传递地拉入libglpk依赖。

    g++ -fPIC -shared -lglpk -o libmyCode.so myCode.c
    

    【讨论】:

    • 您好,非常感谢您的回复。我试着按照你说的运行 g++ -fPIC -shared -lglpk -o libmyCode.so myCode.c 但我仍然从 Modelica 留言板上得到错误 "ELF”等等。我对这个 C 编程和 Modelica 完全陌生,所以这里有点无能为力。非常感谢!
    【解决方案2】:

    我设法解决了这个问题。

    我所做的是:

    1. 编译位于 /usr/local/include/ 的 glpk.h 使用
    gcc -c glpk.h -o libglpk.o
    
    1. 使用@ReinstateMonica 回答,我将 .c 文件转换为 .so
    gcc -fPIC -shared -lglpk -o liblinprog.so st_linprog.c
    
    1. 在我的 Modelica 中的 function.mo 中,我将注释如下
    annotation(Library ={"linprog","glpk"},
               LibraryDirectory="modelica://SolarTherm/Resources/Include/lib");
    

    我的理解是,由于我的 st_linprog.c 依赖于 libglpk,那么为了让 Modelica 能够使用 libglpk 运行,我必须编译 glpk.h 并将 st_linprog.c 转换为共享库。在 st_linprog.c 转换为共享库期间,-lglpk 标志确保共享库链接到 libglpk(我认为)。

    如果你们有更优雅的方法,请在这里分享!干杯,

    菲尔

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-09-17
      • 1970-01-01
      • 2018-09-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多