外部函数:调用使用外部库的 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
我设法解决了问题。
我所做的是:
- 使用
编译位于/usr/local/include/的glpk.h
gcc -c glpk.h -o libglpk.o
- 使用@ReinstateMonica 的回答,我将我的 .c 文件变成了 .so
gcc -fPIC -shared -lglpk -o liblinprog.so st_linprog.c
- 在我的 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(我认为)。
如果大家有更优雅的方法欢迎分享!干杯,
菲尔
我正在尝试在我的 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
我设法解决了问题。
我所做的是:
- 使用 编译位于/usr/local/include/的glpk.h
gcc -c glpk.h -o libglpk.o
- 使用@ReinstateMonica 的回答,我将我的 .c 文件变成了 .so
gcc -fPIC -shared -lglpk -o liblinprog.so st_linprog.c
- 在我的 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(我认为)。
如果大家有更优雅的方法欢迎分享!干杯,
菲尔