在Windows上使用gcc在C语言中嵌入Julia时找不到入口点

时间:2019-02-07 22:47:45

标签: c gcc julia embed

我正在尝试为我的Julia模块创建一个C语言包装器,以便可以轻松地将其集成到我们正在使用的另一个更大的程序中,该程序位于C中。如果我的问题只是无知之一,我向您道歉这是一个愚蠢的问题,因为我对C不太熟悉(我只了解这种特定语言的最基本的知识,我做了一点点修改,但从未在C中做过认真的项目),而且我不是从事贸易的程序员(我是一名贸易科学家,我只是在学习过程中才学习编程,并且大多使用更高级的语言。另外,如果我的问题是在错误的部分或类似的内容上表示歉意,我在这里很新,所以对礼节非常熟悉,并且不确定这是否属于stackoverflow或超级用户,因为它介于两者之间(我认为)。

因此,为了实现这一目标,我尝试着从here中发现的嵌入在C语言中的Julia代码的基本示例开始。因此,首先我尝试遵循“使用julia-config自动确定构建参数”一节。因此,我制作了一个名为“ ccalltest.c”的C源文件,并复制并粘贴了示例代码,并尝试在MSYS2 shell中运行命令。我得到以下输出:

Cian@Cians-Laptop MSYS /c/Users/Cian/Documents/Programming/WorkProjects/nanoconc
$ C:/Users/Cian/AppData/Local/Julia-1.1.0/share/julia/julia-config.jl --cflags --ldflags --ldlibs | xargs gcc ccalltest.c
In file included from C:\Users\Cian\AppData\Local\Julia-1.1.0\include\julia/ios.h:7:0,
                 from C:\Users\Cian\AppData\Local\Julia-1.1.0\include\julia/libsupport.h:13,
                 from C:\Users\Cian\AppData\Local\Julia-1.1.0\include\julia/julia.h:12,
                 from ccalltest.c:1:
C:\Users\Cian\AppData\Local\Julia-1.1.0\include\julia/uv.h:59:22: fatal error: uv/unix.h: No such file or directory
compilation terminated.

我认为这可能是我不熟悉MSYS2的问题,据我所知,似乎“ julia-config.jl”脚本只是生成了您仍然需要编译程序的gcc构建参数,所以我决定尝试只在Powershell中运行脚本以生成参数,然后在我调用gcc时添加生成的参数。因此,我使用“ --allflags”标志运行了脚本,它给了我以下内容:

-std=gnu99 -I'C:\Users\Cian\AppData\Local\Julia-1.1.0\include\julia' -DJULIA_ENABLE_THREADING=1 -L'C:\Users\Cian\AppData\Local\Julia-1.1.0\bin' -Wl,--stack,8388608 -ljulia -lopenlibm

所以,我继续输入命令:

gcc ccalltest.c -std=gnu99 -I'C:\Users\Cian\AppData\Local\Julia-1.1.0\include\julia' -DJULIA_ENABLE_THREADING=1 -L'C:\Users\Cian\AppData\Local\Julia-1.1.0\bin' -Wl,--stack,8388608 -ljulia -lopenlibm

,它返回了错误:

At line:1 char:164
+ ... EADING=1 -L'C:\Users\Cian\AppData\Local\Julia-1.1.0\bin' -Wl,--stack, ...
+                                                                 ~
Missing argument in parameter list.
    + CategoryInfo          : ParserError: (:) [], ParentContainsErrorRecordException
    + FullyQualifiedErrorId : MissingArgument

据我所知,这个错误似乎是在说编译器不会接受-Wl,标志,这很奇怪,因为它在“ gcc --help”下被列为标志,但是我真的不了解如何解决此问题,所以我决定尝试不使用-Wl选项进行编译。因此,我尝试使用以下命令进行编译:

gcc ccalltest.c -std=gnu99 -I'C:\Users\Cian\AppData\Local\Julia-1.1.0\include\julia' -DJULIA_ENABLE_THREADING=1 -L'C:\Users\Cian\AppData\Local\Julia-1.1.0\bin' -ljulia -lopenlibm

它设法编译了一个.exe文件,但是当我尝试运行该文件时,出现一条错误消息:“过程入口点_ZSt14__once_functor不能位于动态链接库C:\ Users \ Cian \ AppData \ Locl中\ Julia-1.1.0 \ bin \ LLVM.dll”。

所以,基本上,这就是我目前的情况。我认为问题可能在于-Wl部分很重要?但是我不知道如何解决它,如果我包含它,它给我一个错误。这可能是一些愚蠢的修复,只会显示我对编译语言和C缺乏经验,但是我非常感谢任何人都可以提供的任何帮助!我花了几天的时间试图弄清楚这个问题,并在这里浏览了论坛以寻找解决方案,然后才最终决定问,所以这实际上是我放弃之前的最后选择。

更新:自发布此消息以来,我还尝试使用clang,g ++(作为c ++代码)和visual studio(同时包含c和c ++)来编译程序,并且每次都收到相同的“ _ZSt14__once_functor”错误消息。我已经在llvm.dll库上运行了“ dumpbin / EXPORTS”,并确认尽管存在很多“ _ZSt13__”和“ _ZSt16__”文件,但不存在这样的功能,因此似乎有可能存在“ _ZSt14__”功能应该存在吗? Ive还尝试从C#(使用DllImport)和python(使用ctypes)调用julia函数,并且我还遇到错误,提示“找不到指定的过程”,这大概与缺少函数有关。最后,我尝试使用相同的代码将julia嵌入到之前未用于编程的借用笔记本电脑上的julia新安装中,并得到完全相同的错误消息。

0 个答案:

没有答案