Vsevolod
есть простой вариант залинковать плагин со статической библиотекой с этой функцией
Vsevolod
я просто думал, вдруг знает кто, на будущее
Berkus
а то у меня шланг выкидывает определенный символ (с lto), а потом ломается dlopen плагина, который на этот символ рассчитывает
в таком случае стоит подкладывать такие функции в виде -whole-archive чтобы они не удалялись
Matwey
Я знал но забыл
Berkus
еще по идее можно их экспортировать через линкерскрипт например
Matwey
На самом деле во многих разделяемых библиотеках люди с помощью компиляторо-специфичных костылей контролируют какие символы показывать наружу, а какие не показывать.
Vsevolod
@berkus whole-archive - это эребор в данном случае
Vsevolod
хотя в тестах с luajit без него не получилось обойти
Matwey
Сейчас где-нибудь подглядим
Vsevolod
https://clang.llvm.org/docs/AttributeReference.html#lto-visibility-public-clang-lto-visibility-public-clang-lto-visibility-public
Vsevolod
вот это то, что мне нужно
Matwey
-Wl,-export-symbols-regex
Александр
ну почему, почему в C++ нельзя алиасить имя функции?
я знаю, что макросы - это плохо и что лучше капсом их выделять, но запилил себе такую штуку
Александр
если кодом, то #define alias(func) \ [](auto&& ...args) noexcept(noexcept(func(std::forward<decltype(args)>(args)...))) \ -> decltype(func(std::forward<decltype(args)>(args)...)) \ { return func(std::forward<decltype(args)>(args)...); }
Aidar
пиши пропосол
Aidar
подчистите пожалуста супа и ультрамега тоже
Aidar
го using length()=size;
хм сюда бы еще изменение порядка переменных прифигачить например
Andrei
stl к типам в алгоритмах и контейнерах какие требует обязательный операторы сравнения? меньше и равеноство?
Berkus
хм сюда бы еще изменение порядка переменных прифигачить например
типа inline auto length(size_t arg, int v) { return size(v, arg); } да, это пожалуй стоит пропозала
Constantine
Звучит интересно, можно код глянуть?
Там достаточно много букв, если кратко - был guard объект (unique_ptr на vdtor_interface), который занулялся лямбдой, существование которой этот объект и контролирует На псевдокоде struct guard_interface { virtual ~guard_interface() = default; }; using guard_ptr = std::unique_ptr<guard_interface>; //тип once_callable_function определяет MC-аналог std::function с не более, чем однократным вызовом //может создаваться из mutable lambda struct event_queue { guard_ptr push(once_callable_function_ptr<void()> event); //добавляет в очередь, возвращает guard_ptr на удаление из очереди }; struct guarded_event_factory { //фабрика по производству событий std::function<void()> event_; guard_ptr guard_event_posted_; //guard на случай уже добавленного сообщения /*~guarded_event_factory() { guard_event_posted_ = nullptr; } */ //раскомментировать для фикса void start() { //запуститься assert(!guard_event_posted_); //в очереди нет события guard_inqueue = make_guard_from_once_callable_function([this] () { //сброс этого guard означает, что объекта в очереди нет this->guard_posted_event_ = nullptr; }); guard_posted_event_ = event_queue_ref().push( [guard_inqueue_ = std::move(guard_inqueue), event_copy_ = event_] () mutable { guard_inqueue_ = nullptr; //очередь перед вызовом гарантированно удалила объект из очереди return event_copy_(); } } }; void user_code() { guarded_event_factory factory([](){}); factory.start(); //деструктор убьет ногу }
Berkus
боже, как хорошо что ты не пишешь в моей компании код
Berkus
я прямо очень рад
Constantine
что тебе не нравится?)
Aidar
почему у тебя псевдокод плюсовый?
Constantine
@berkus серьезно, я готов слушать)
Berkus
@berkus серьезно, я готов слушать)
я несерьезно, но у тебя фарш из snake_case и CamelCase даже в этом маленьком примере!!!!!111один
Vsevolod
snake_OiL
Constantine
я несерьезно, но у тебя фарш из snake_case и CamelCase даже в этом маленьком примере!!!!!111один
ой! ща поправлю. я на самом деле пишу на неродной версии, переводя имена на более привычные читателю
Constantine
я несерьезно, но у тебя фарш из snake_case и CamelCase даже в этом маленьком примере!!!!!111один
кстати, у меня сейчас mixed конвенция на вспомогательный/основной код, вполне приятно работать, в вызовах CamelCase(namespaced::snake_case()) очень быстро привыкаешь отсматривать CamelCase вызовы
Nik
CamelCase O_o
Nik
всмысле, не camelCase a CamelCase
Berkus
всмысле, не camelCase a CamelCase
это lowerCamelCase и CamelCase да
Constantine
ага. с этой вашей мфсёвой m_нотацией
Alex
Народ прошу о помощи: для Nuke7 на Linux есть кастомная нода, компилятор gcc. Понятно, что когда перешли на Nuke10.5 нужно перекомпилить. Команда: gcc -shared -I/mnt/opt/Nuke7.0v9/include/ -o betap1.so -fPIC betap1.cpp Человек который раньше этим занимался недоступен((((( Пробовал повторить для Nuke7 ноду, но получил другого размера и при загрузке в Nuke выдаёт: /mnt/opt/NukePlug/betap1.so: undefined symbol: _ZNK2DD5Image2Op15input_longlabelB5cxx11Ei while executing "betap1" Вообщем, помогите люди добрые, кто чем может!
Alex
я написал, что поппытался повторить для 7-й версии.
Berkus
у вас компилятор поменялся похоже
Berkus
DD::Image::Op::input_longlabel[abi:cxx11](int) const abi::cxx11 очевидно надо отключить, для этого есть флаг
Berkus
_GLIBCXX_USE_CXX11_ABI
Berkus
старые сборки были видимо gcc4.x
Alex
компилятор проверял, вскрыл so - версия совпадает
Berkus
в либе nuke есть этот символ, проверил?
Alex
GCC: (GNU) 6.3.1 20161221 (Red Hat 6.3.1-1)
Berkus
DD::Image::Op::input_longlabel[abi:cxx11](int) const
Anonymous
Мир вашему дому, господа байтоебы.
Alex
в либе Nuke _GLIBCXX_USE_CXX11_ABI нигде не упоминается
Alex
нет
Berkus
ну тогда gcc не врёт - его там нету
Alex
при компиле D_GLIBCXX_USE_CXX11_ABI использовать? так , что ли?
Berkus
при компиле D_GLIBCXX_USE_CXX11_ABI использовать? так , что ли?
ты ошибку прочитал которую тебе написали?
Berkus
при загрузке в Nuke выдаёт: /mnt/opt/NukePlug/betap1.so: undefined symbol: DD::Image::Op::input_longlabel[abi:cxx11](int) const while executing "betap1"
Alex
так ты мне намекаешь, что не хватает каких-то настроек в самой либе? Я давно в С не сидел, и понимаю, что сильно туплю
Berkus
тебе нужно найти где не зватает этого символа и откуда он должен взяться, всё
Alex
но и в Nuke7 его тоже нигде нет((((( Спасибо, пойду копать инфу по этому параметру
Berkus
он может быть внутри вашего модуля
Berkus
либо определен, либо ссылкой на какую-то third-party либу которую вы использовали но сейчас ты забыл ее прилинковать (у вас, очевидно, нет никакой билдсистемы?)
Alex
уже везде посмотрел, все либы(
Alex
конечно нет) 1-й рас компилю на Линуксе
Berkus
вместо gcc -shared -I/mnt/opt/Nuke7.0v9/include/ -o betap1.so -fPIC betap1.cpp попробуй gcc -shared -I/mnt/opt/Nuke7.0v9/include/ -o betap1.so -fPIC betap1.cpp -Wl,--no-undefined
Alex
спс, пробую
Alex
((( большое полотно с " undefined reference to"
Alex
Chebyrash
compile
Berkus
Nuke7.0v9/include/DDImage/ ну DD::Image точно часть Nuke хех
Berkus
auto_ptr! жуть
Berkus
gcc -shared поменяй на g++ -shared
Berkus
пушо это не сишка а плюсы, после этого запости снова чо получилос
Alex
тоже самое выдало - куча "undefined reference to"
Berkus
должно быть меньше чем раньше
Berkus
заливай сюда
Alex
Alex
да немного мешьше