首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Libdl.dlopen杀死朱莉娅

使用Libdl.dlopen杀死朱莉娅
EN

Stack Overflow用户
提问于 2018-03-03 13:52:04
回答 2查看 415关注 0票数 0

我试图从Julia v0.6.2,Windows 10调用C代码。

这是我用西格温 gcc编译成一个DLL的C代码。

代码语言:javascript
复制
int timesTwo(int x) {
    return 2*x;
}

编译命令:

代码语言:javascript
复制
gcc -c mydll.c
gcc -shared -o mydll.dll mydll.o

我用测试C程序测试了DLL,它可以工作。然后我试着用一个通向DLL的绝对路径来调用朱莉娅。

代码语言:javascript
复制
using Base.Libdl
x = Int32(2)
mylib = dlopen("C:\\Users\\pedro\\Documents\\codigos\\exampleDLL\\C\\mydll.dll")
ccall((:timesTwo, mylib), Int32, (Int32,), x)

然后,朱莉娅的工作区被重新启动(当我使用命令dlopen时,所有变量都会变得没有定义)。

发生了什么,我该怎么解决呢?

更新

那一定是窗口问题。无法在Ubuntu发行版中复制。

EN

回答 2

Stack Overflow用户

发布于 2018-03-03 20:44:22

我会尝试使用朱莉娅使用的编译器(带有-fPIC标志)来构建DLL。在Windows上,julia实际上是用交叉编译器构建的:

https://github.com/JuliaLang/julia/blob/master/README.windows.md#cygwin-to-mingw-cross-compiling

您能否安装mingw64-x86_64-gcc核心包(仅用于C编译器),并使用x86_64-w64-mingw32-gcc编译器命令(而不是command )?

票数 1
EN

Stack Overflow用户

发布于 2018-03-03 21:20:06

使用-fPIC开关生成与位置无关的代码。另外,除非在特定平台上将Julia定义为int32,否则您可能在欺骗int32。当然,您需要将ccall((:timesTwo, mylib), Int32, (Int32,), x)更改为ccall((:timesTwo, mylib), Cint, (Cint,), x)。最后,为了使代码对任何操作系统都有效,请考虑将mylib = dlopen("C:\\Users\\pedro\\Documents\\codigos\\exampleDLL\\C\\mydll.dll")替换为const mylib = dlopen(joinpath(pwd(), "mydll.dll"))const的存在是出于效率原因,joinpath与操作系统无关,这意味着它将为基于*nix的系统添加正斜杠。例如,稍后当您想要将库更改为.so时,您也不应该处理斜杠。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49084874

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档