Vsevolod
есть простой вариант залинковать плагин со статической библиотекой с этой функцией
Vsevolod
я просто думал, вдруг знает кто, на будущее
Berkus
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
Александр
если кодом, то
#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
подчистите пожалуста супа и ультрамега тоже
Berkus
Andrei
stl к типам в алгоритмах и контейнерах какие требует обязательный операторы сравнения? меньше и равеноство?
Alexander "SonnySlave"
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 серьезно, я готов слушать)
Vsevolod
snake_OiL
Nik
CamelCase O_o
Nik
всмысле, не camelCase a 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"
Вообщем, помогите люди добрые, кто чем может!
Berkus
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 нигде не упоминается
Berkus
Berkus
Alex
нет
Berkus
ну тогда gcc не врёт - его там нету
Alex
при компиле D_GLIBCXX_USE_CXX11_ABI использовать? так , что ли?
Berkus
Berkus
при загрузке в Nuke выдаёт:
/mnt/opt/NukePlug/betap1.so: undefined symbol: DD::Image::Op::input_longlabel[abi:cxx11](int) const
while executing
"betap1"
Alex
так ты мне намекаешь, что не хватает каких-то настроек в самой либе? Я давно в С не сидел, и понимаю, что сильно туплю
Berkus
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
Berkus
gcc -shared поменяй на g++ -shared
Berkus
пушо это не сишка а плюсы, после этого запости снова чо получилос
Alex
тоже самое выдало - куча "undefined reference to"
Berkus
должно быть меньше чем раньше
Berkus
заливай сюда
Alex
Alex
да немного мешьше