испортил пути lua после попытки настроить отладку - PullRequest
2 голосов
/ 14 октября 2019

Я бы хотел отладить свой путь через большую кодовую базу lua. Для этого я скачал ZeroBrane и следовал их инструкциям по настройке связанного mobdebug.

Кодовая база - koreader. Следующий шеллскрипт воспроизводит то, что я сделал:

# dependencies for building koreader
sudo apt-get install build-essential git patch wget unzip \
gettext autoconf automake cmake libtool nasm luarocks libsdl2-dev \
libssl-dev libffi-dev libsdl2-dev libc6-dev-i386 xutils-dev linux-libc-dev:i386 zlib1g:i386

# get the source
git clone https://github.com/koreader/koreader.git
cd koreader && ./kodev fetch-thirdparty

# build it, this will take a long time
./kodev build

# assuming you have ZeroBrane installed
export ZBS=/opt/zbstudio
export LUA_PATH="./?.lua;$ZBS/lualibs/?/?.lua;$ZBS/lualibs/?.lua"
export LUA_CPATH="$ZBS/bin/linux/x86/?.so;$ZBS/bin/linux/x86/clibs/?.so"

# execute it, this will run lua
./kodev run

Выполнение ./kodev run приводит к следующему сообщению об ошибке:

 [*] Current time: 10/14/19-17:55:34
./luajit: ./datastorage.lua:3: module 'libs/libkoreader-lfs' not found:
    no field package.preload['libs/libkoreader-lfs']
    no file './libs/libkoreader-lfs.lua'
    no file '/opt/zbstudio/lualibs/libs/libkoreader-lfs/libs/libkoreader-lfs.lua'
    no file '/opt/zbstudio/lualibs/libs/libkoreader-lfs.lua'
    no file '/opt/zbstudio/bin/linux/x86/libs/libkoreader-lfs.so'
    no file '/opt/zbstudio/bin/linux/x86/clibs/libs/libkoreader-lfs.so'
stack traceback:
    [C]: in function 'require'
    ./datastorage.lua:3: in main chunk
    [C]: in function 'require'
    ./reader.lua:18: in main chunk
    [C]: at 0x55a81bf25771
~/programming/koreader

Если нет определений LUA_PATH и LUA_CPATH, проблем нет и koreader работает нормально. Итак, я предполагаю, что пути импорта как-то нарушены. Как мне установить это правильно?

Может быть, это поможет вам, если я правильно прочитал код, ./kodev run (в какой-то момент) выполнит это:

-- set search path for 'require()'
package.path =
    "common/?.lua;rocks/share/lua/5.1/?.lua;frontend/?.lua;" ..
    package.path
package.cpath =
    "common/?.so;common/?.dll;/usr/lib/lua/?.so;rocks/lib/lua/5.1/?.so;" ..
    package.cpath

Фактическое местоположениеlibkoreader-lfs.so:

/home/lklein/programming/koreader/base/build/x86_64-linux-gnu-debug/libs/libkoreader-lfs.so

Действительно, если я добавлю это к CPATH с помощью

/home/lklein/programming/koreader/base/build/x86_64-linux-gnu-debug/?.so

, то он может работать. Что здесь делает Луа? Всегда ли предполагается наличие некоторых значений по умолчанию LUA_PATH и LUA_CPATH, если они не установлены? Потому что все работает нормально, без указания пути.

Ответы [ 2 ]

1 голос
/ 15 октября 2019

Значения по умолчанию для обоих путей находятся в luaconf.h # LUA_PATH_DEFAULT ff. (5.3).

При этом ваш LUA_CPATH пропускает две вещи по умолчанию: LUA_CDIR/loadall.so и ./?.so. В вашем случае проблема связана с отсутствием второго.

Это потому, что ./kodev run выполняет некоторые дополнительные действия для настройки среды выполнения. В какой-то момент рабочий каталог меняется на EMU_DIR (например, ./koreader-emulator-x86_64-linux-gnu-debug/koreader). Этот каталог также имеет действительный libs/libkoreader-lfs.so.

Замените LUA_CPATH на ./?.so:

export LUA_CPATH="$ZBS/bin/linux/x86/?.so;$ZBS/bin/linux/x86/clibs/?.so;./?.so"
0 голосов
/ 14 октября 2019

Ваш код пытается загрузить библиотеку libkoreader-lfs, которая не найдена ни в одном из путей, установленных в LUA_CPATH или LUA_PATH. Я не знаю структуру вашего проекта, чтобы дать вам точный ответ, но поскольку он работает, когда вы не настраиваете эти переменные среды, и не работает, когда вы это делаете, похоже, вы перезаписываетенекоторые значения по умолчанию для этих переменных.

Попробуйте , добавив к этим переменным вместо установка их:

export LUA_PATH="$LUA_PATH;./?.lua;$ZBS/lualibs/?/?.lua;$ZBS/lualibs/?.lua"
export LUA_CPATH="$LUA_CPATH;$ZBS/bin/linux/x86/?.so;$ZBS/bin/linux/x86/clibs/?.so"
...