Igor
Или как-то так лн называется
Snusmumriken
/usr/bin/ld: cannot find -llua51 collect2: error: ld returned 1 exit status А где собственно llua51 взять?
Ну во-первых найти не "llua51", это -l и lua5.1, две разные штуки. Но пишутся слитно. И да, нужен пакет.
Hello, World! 🎄
gcc -shared -L./lua/lua.h -I./lua/luaxlib.h -l lua5.1 main.c -o ./mylib.dll Типо так :\
Hello, World! 🎄
О, скомпилировал
Hello, World! 🎄
-fPIC в конец надо было добавить
Hello, World! 🎄
local lib = require'mylib' print(lib.summ(10, 20)) Нечего не возвращает :\
Hello, World! 🎄
Ошибка сегментирования
Aydar
Ошибка сегментирования
summ как-то неправильно реализована и выполняет недопустимую операцию с памятью.
Hello, World! 🎄
Код Snusmumriken
Hello, World! 🎄
Хотя я под Linux, может там под Windows код
Aydar
Хотя я под Linux, может там под Windows код
Нормальный код вроде, а файлик с либой у тебя mylib.dll называется?
Aydar
Сначала sudo apt install liblua5.1-0-dev Потом gcc -shared main.c -llua5.1 -o mylib.so Ну и когда скомпилируется грузи либу тоже с помощью lua5.1
Snusmumriken
Например
Aydar
Например
Я думал сейчас полезная длинная мысль будет
Snusmumriken
Кароч, смотри, схема такая: У сишки есть заголовки. Оно же — условные имена функций и их схема. Ты их используешь в биндингах и всякой фигне. Есть шаред-либы (dll/so). В них находится содержимое заголовков, конкретные функции и прочая лабуда. Когда ты собираешь с -llua51— ты такой берёшь и даёшь компилятору по схеме заголовков конкретную либу. Компилятор такой смотрит на подключаемые заголовки, ищет в .c-файлах или шаред либе соответствующие функции и подрубает их, ругаясь если не нашёл (это же компилятор). Собранная тобой фигня будет использовать её же.
Igor
А ещё чтобы не путаться начинающим стоит сразу условно в голове у себя компилятор разделить на две части, назовём их транслятор и линкер. Транслятор переводит твою писанину в машинный код, а линкер подключает к сгенерированному коду сторонние библиотеки. Абсолютно на все функции, которые вызываются программой в машинном коде (не учитывая динамические вызовы, но об этом уже потом, о них ещё рано говорить) должны быть найдены линкером. Если он хоть одну не найдёт, то ты выходной файл уже не получишь, а получишь только ошибку линковки.
Snusmumriken
Рано.
usernameak
Рано.
что?
Snusmumriken
Рано про два-три-пять линкеров, препроцессоры, линтеры и прочую дичь. Слишком много фигни для ХеллоВорлда. Сначала с этим бы разобраться
Igor
Главное сейчас не начать затирать про соглашения вызовов, инлайн, статик функции, чем отличается статик инлайн от просто инлайна (кстати не для всех компилеров это что-то разное)
Igor
А то это конкретно мозг взорвёт человеку
Igor
У си вообще много неочевидных тонкостей
Igor
Хотя когда пишешь долгое время на нём, то они становятся довольно очевидными.
usernameak
или ты не про плюсы? в си вроде как вообще нет ключевого слова inline
Igor
Я про сишку чистую
usernameak
Смотря в каком стандарте
уж так вышло, что выше C89 я не трогал
Igor
В последнее время границы между крестами и чистым си довольно размыты
usernameak
уж так вышло, что выше C89 я не трогал
из-за старых компиляторов
Igor
В чистом си разве что классы и прочая вся эта бесовщина отсутствует
Igor
А так в целом, считай, делает то же самое, что и новейшие кресты в большинстве задач
Igor
Есть отличия, конечно, но они все менее и менее существенны
usernameak
есть и вещи которых нет в плюсах, но есть в си
Igor
Это да
Igor
https://stackoverflow.com/questions/7762731/whats-the-difference-between-static-and-static-inline-function А вот, кстати, по инлайнам откопал
usernameak
Например, считать в комптайме?
с этим и плюсы не очень-то справляются
Wsevolod
с этим и плюсы не очень-то справляются
Почему, CTRE же соорудили, ни в каком другом язычке такого нету
usernameak
Почему, CTRE же соорудили, ни в каком другом язычке такого нету
в D было задолго до плюсов, причём плюсы всё ещё недотягивают
Wsevolod
в D было задолго до плюсов, причём плюсы всё ещё недотягивают
А там встроено в яп, или на его возможностях?
Igor
CTRE только больше усложняет всё
Igor
В комптайме по хорошему бы поменьше действий делать такого плана
usernameak
а как RE расшифровывается в данном контексте-то?)
Igor
В том плане, что читабельность страдает
usernameak
Regular expression?
тогда в D есть в стд)
usernameak
да и там вообще огромный сабсет языка можно в компилтайме крутить
usernameak
разве что выделение памяти с ограничениями и недоступен GC
Igor
Я D особо не тыкал, не могу по нему чего-то умного сказать
usernameak
неплохой язык, который не особо сыскал популярности по ряду причин во-первых, ужасная реализация - компилятор падает регулярно во-вторых, отсутствие стандартной библиотеки как таковой - они по сути стороннюю библиотеку взяли как стд в-третьих, он не очень справляется с некоторые заявленными про него вещами
Igor
Ох блин
usernameak
например там есть GC, который как бы отключаемый, но std его использует на каждом углу
Igor
Ну и кстати да, когда в комптайм всякие навороты добавляются, там не знаю, допустим, теми же препроцессор регулярками обрастает, это очевидно значит, что компилятор сильно усложняется, а соответственно и вероятность ошибки внутри него выше. Именно по этому я считаю, что всякие препроцессоры должны быть максимально простыми и прозрачными.
usernameak
в D это возведено прям в абсолют - там можно использовать строку, который вернула другая компилтайм функция, как кусок кода
Igor
Я прям уже представляю, как весело читать чужой код на этом языке
usernameak
на удивление - несколько лучше чем код на плюсах но все равно средне
Igor
Ой ну для меня любой код читать проще, чем код на крестах
Igor
Эти все его перегрузки функций, классы, бее
usernameak
достаточно качественный код на плюсах из нулевых почему-то обычно более читаем, чем достаточно же качественный код из сейчас
Igor
(Любой код не помешанного настолько же на ООП языка)
usernameak
Igor
Хе, ну в принципе да
usernameak
*вставьте сюда пасту о поголовном отупении человечества*
что характерно, с плохим кодом всё в точности наоборот
Snusmumriken
А вот чем D покорил сердечко — нормальными вараргами, которые ещё автоматом конвертятся между func(arr_or_tuple_of_args) и func(arg1, arg2, arg3)
Igor
Прикольненько
Snusmumriken
Я прям уже представляю, как весело читать чужой код на этом языке
Но вот эта фигня обычно делается а ля темплейты, полёт нормальный.
Igor
Может попробую его когда-нибкдь
Igor
Я всё до ржавого добраться не могу, а уже года 2-3 хотелка присутствует, его синтаксис както местами отпугивает, си полицеприятнее в этом плане для меня
Hello, World! 🎄
Спасибо
Hello, World! 🎄
main.c #include "lua/lua.h" #include "lua/lauxlib.h" #include "string.h" #if defined(_WIN32) || defined(_WIN64) __declspec(dllexport) #endif int lua_string_sub(lua_State *L){ const char *a = luaL_checkstring(L, 1); int start = luaL_checknumber(L, 2)-1; if(start < 0) {start = 1;} int end = luaL_checknumber(L, 3)-1; char c[strlen(a)]; int j = 0; for(int i = start; j <= end && strlen(a) >= i; i++){ c[j] = a[i]; j++; } lua_pushlstring(L, c, j); return 1; } int luaopen_mylib(lua_State *L) { lua_newtable(L); lua_pushstring(L, "sub"); lua_pushcfunction(L, lua_string_sub); lua_rawset(L, -3); return 1; } main.lua local lib = require'mylib' print(lib.sub("Hello, World!", 1, 5)) output: Hello
Hello, World! 🎄
Кстати, lib.dll\lib.so работает с Love2d нормально, а с новой версией Lua5.3.3 не хочет 😐
Hello, World! 🎄