Точка входа не найдена при встраивании Джулии в C с помощью gcc в Windows - PullRequest
0 голосов
/ 08 февраля 2019

Я пытаюсь создать оболочку для языка C для моего модуля Julia, чтобы его можно было легко интегрировать в другую, более крупную программу, над которой мы работаем, которая находится на C. Я заранее извиняюсь, если моя проблема - только из-за невежестваи это глупый вопрос, так как я не очень знаком с C (я знаю только самые базовые основы этого конкретного языка, я немного поработал, но никогда не делал серьезного проекта на C), и я не программист по профессии (Я ученый по профессии, я изучал программирование только по мере продвижения и в основном использую более высокоуровневые языки).Кроме того, извинения, если мой вопрос находится в неправильном разделе или что-то в этом роде, я новичок здесь, так что я не очень знаком с этикетом, и я не уверен, принадлежит ли он стековому потоку или суперпользователю, так как он находится на полпути между областью действия двух (я думаю).

Итак, чтобы работать для достижения этой цели, я пытался начать с базовых примеров кода Джулии, встроенного в C, который найден здесь .Итак, сначала я попробовал следовать разделу «Использование julia-config для автоматического определения параметров сборки. Итак, я сделал исходный файл C под названием« ccalltest.c »с примером кода, скопированным и вставленным, и попытался выполнить команду в оболочке MSYS2.Я получил следующий вывод:

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 ".

Итак, в основном, это моя текущая ситуация.Я думаю, что проблема может быть в том, что часть важна?Но я понятия не имею, как это исправить, и это дает мне ошибку, если я включаю это.Возможно, это глупое исправление, которое покажет мой недостаток опыта, когда дело доходит до компилируемых языков и Си, но я был бы очень признателен за любую помощь, которую кто-либо мог бы предложить!Я потратил пару дней, пытаясь разобраться в этой проблеме и просматривая форумы здесь в поисках решений, прежде чем я наконец сдался и решил спросить, так что это действительно мое последнее средство перед тем, как сдаться.

Обновление: с тех порпубликуя это, я дополнительно попытался скомпилировать программу, используя clang, g ++ (как код c ++) и visual studio (как с c, так и c ++), и каждый раз получал одно и то же сообщение об ошибке «_ZSt14__once_functor».Я запустил «dumpbin / EXPORTS» в библиотеке llvm.dll и подтвердил, что такой функции нет, хотя существует много файлов «_ZSt13__» и «_ZSt16__», поэтому кажется вероятным, что есть функция «_ZSt14__»должен присутствовать?Я также пытался вызвать функции julia из C # (используя DllImport) и python (используя ctypes), и я также получаю сообщения об ошибках «указанная процедура не найдена», которые предположительно связаны с отсутствующей функцией.Наконец, я попытался внедрить julia, используя тот же код на новой установке julia на заимствованном ноутбуке, который раньше не использовался для программирования, и получил точно такое же сообщение об ошибке.

...