外部函数:调用使用外部库的 C 脚本

External functions: Calling a C script that use external Library

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

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

我注意到 运行 独立模式下的 C 代码,必须使用特殊的 linker

gcc standalonecode.c -lglpk -o standalone

我认为问题出在 linking 过程中,但我不明白如何告诉 Modelica 自动执行 link。知道如何在 Modelica 中解决这个 linking 问题吗?

谢谢你,祝你好运

您没有使用特殊的 linker。 -lglpk 刚刚告诉 linker 使用 glpk 库 (libglpk) link 你的可执行文件。

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

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

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

我设法解决了问题。

我所做的是:

  1. 使用
  2. 编译位于/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. 在我的 function.mo 我的 Modelica 中,我把注释如下
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(我认为)。

如果大家有更优雅的方法欢迎分享!干杯,

菲尔