2014-01-13 3 views
0

У меня есть рабочее C-расширение для Racket. В Racket CLI и окне взаимодействия DrRacket он работает как шарм. Однако я не могу заставить его работать в окне определений DrRacket, что было бы очень полезно, поскольку это интерфейс для моих учеников для разработки своих программ.C-расширения в DrRacket

Проблема заключается в том, что определения в расширении не «видны» (или зарегистрированы или что-то еще). Модуль загружается (или, по крайней мере, найден), но DrRacket жалуется, что у него нет разрешения на выполнение, что я не понимаю.

В коде C я объявил расширение, чтобы быть модулем и я попробовал оба метода включения:

(нагрузка-удлинение «racket_extension.so») и (требуют «racket_extension.rkt»); который требует, чтобы вы поместили его в папку по отношению к текущей рабочей папке следующим образом: «compiled/native/x86_64-linux/3m/racket_extension_rkt.so»

Ни один из методов не работает. Первый случай не дает ошибки, но определения внешнего не регистрируются («undefined»).

Во втором случае DrRacket выдает ошибку: запрещенных (выполнение) доступа к .... скомпилирован/родному/x86_64-линукс/3m/racket_extension_rkt.so , но почему?

У кого-нибудь есть идеи, как я могу заставить это работать? Что мне не хватает?

Спасибо! Marc

+0

У меня нет ответа для вас, но я думаю, что вы с большей вероятностью получите ответ, если вы попросите об этом в списке рассылки Racket: http://lists.racket-lang.org/users/ –

+0

Спасибо Асуму, я буду. Я поместил его на канал IRC, но ответа пока нет. – Emjee

ответ

0

Как вы компилируете и связываете расширение? Вы используете raco ctool или gcc? Выполняется ли DrRacket в том же каталоге, что и ваш скомпилированный каталог? Обычно я проверяю свои расширения: drracket my_ext_test.rkt в том же каталоге, что и мой скомпилированный каталог. Для меня это было проблемой в прошлом. Кроме того, если он говорит, что действие запрещено, вы пытались изменить разрешения своего .so? Может быть, это так просто. Я бы начал с простого примера Writing Racket Extensions и убедиться, что вы можете заставить программу hello world работать в окне определений. У меня лично никогда не было проблемы, о которой вы упомянули, но я также работаю на Linux.

+1

Спасибо, я недавно получил его работу с окончательной деталью, исходящей от сообщества. Он не имел никакого отношения к разрешениям .so, но, видимо, я экспортировал свои C-функции в пространство имен верхнего уровня, а не в пространство имен модулей, поэтому я изменил schem_add_global («function-one», proc, env) info schem_add_global (" function-one ", proc, mod_env), и это сработало. – Emjee

+0

Я поместил проект, используя C-расширение на github: https://github.com/marcdinkum/racket_midi Посмотрите, Makefile показывает, как я компилирую и связываю. Думаю, я могу закрыть этот вопрос сейчас, если бы знал, как :-) – Emjee