Constantine
Чсх реактос здорово помогает в плане "как в этой гребаной винде это захакано"
Vladislav
а objdump их показывает?
Anonymous
а другим проектом собирается?
Anonymous
макрос не определен?
ep
3) либа подключается к проге с помощью target_link_libraries Этот пункт точно выполняется правильно? target_link_libraries может молча проглотить несуществующие пути и вообще пустые строки
Anonymous
CV_Export
Anonymous
что там?
Anonymous
вбейте в гугл cmake static library видимо распространенный вопрос
ep
вбейте в гугл cmake static library видимо распространенный вопрос
А что там особенного? Если делать библиотеку то add_library STATIC, если подключать то target_link_libraries, больше там вроде ничего и нет. Просто target_link_libraries не пишет никаких ошибок вообще если в него пихать то чего нет.
Vladislav
гм, магия
Vladislav
а сманглены они одинаково?
Vladislav
тогда cmake с verbose и смотреть, почему он кривые пути компилятору дает
Vladislav
Гм
Vladislav
Погоди, я вроде с чем-то таким сталкивался
Vladislav
Либа у тебя точно с fPIC собралась?
Vladislav
Не имеет, это я гоню
Vladislav
Расскажи
Evgenii
м?
Vladislav
бывает)
Vladislav
единственное, странно что замангленное имя совпало - я поэтому про него и спросил)
Berkus
два егора подряд - это winning streak!
Vitaliy
Товарищи, а может кто в курсе. Как в современных компиояторах обстоит дело со встраиванием функций ? Ещё есть смысл писать inline или компиляторы сами поймут что встроить лучше ?
Berkus
обычно понимают, писать иногда полезно, смотри сгенерированный код
Berkus
если ты просто напишешь inline сильно хуже не будет - эвристики обычно врубаются и отключают инлайнинг если он делает хуже
Berkus
но на все подряд тоже не надо писать
Vitaliy
Berkus
Ну это интересный вопрос
возьми godbolt и поиграйся
Matwey
У gcc даже есть ключи чтобы он написал, что и почему он заинлайнил
Vitaliy
возьми godbolt и поиграйся
Это онлайн компилятор ?
Matwey
Он там пишет иногда типа: тело получилось слишком большое, инлайнить я это не буду!
Berkus
это фронтенд к почти всем существующим компиляторам
Жук
я читал что компилятор в 90% заигнорит требование регистрового хранения, но с инлайн то там все проще
Жук
а, соре, я про С99
Berkus
там оно вроде тоже нооп уже )
Жук
разве? где-то в библиотеках от stm видел
Matwey
слова register в современных плюсах уже нет
Современные компиляторы сами вме распихивают по регистрам. Я никогда не жаловался
Vitaliy
Я так понимаю, что в целом, если функция занимает одну строчку, то можно написать inline, но чего-то от этого ожидать сильно не стоит.
Kirill
Инлайн сейчас пишут чтобы объявленая в хедере не давала компилятору определить себя в каждой единице трансляции и ругнуться компилятору. Считается что компилятор инлайнит определенные в объявлении класса методы. И если включен Lto то инлайнит все подряд что хочет
Kirill
И он прав, пусть инлайнит все что хочет
Matwey
Если ты тело в заголовочном файле написал лучше inline дописать
Vitaliy
Я про cpp )
Kirill
Если в спп кинь ее в анон неймспейс, это даст понять компилятору что функцию после использования в данной единице трансляции можно выкинуть и забыть
Крылатый
На его усмотрение.
Крылатый
inline это пожелание, а не указка.
Vitaliy
inline это пожелание, а не указка.
Нет, я про ситуацию, когда реализация метода прямо в классе и никакого inline нет.
Крылатый
Не помню, чтобы это в стандарте как-то специально оговаривалось, если честно.
Kirill
Я где то читал про то что если методы в объявлении класса определены то они инлайнятся точно, но может я вру, советую проверить и мне сказать, мне тоже интересно)
Matwey
А еще можно -fno-inline
Vitaliy
Спасибо за ответы, попробую поэкспериментировать. Потом отпишусь че и как.
Berkus
Если ты тело в заголовочном файле написал лучше inline дописать
+ ето вот единственное применение наверное
Matwey
+ ето вот единственное применение наверное
Вообще это очень скользкий вопрос, если нет LTO. В двух единицах трансляции получатся два одинаковых символа (если не инлайнить безусловно такую функцию), а как потом такие две единицы слинковать между собой?
Constantine
inline это модификация линковки
Constantine
да, функция реализованная в definition класса - inline
Constantine
inline это модификация линковки
обычно функция или переменная должна быть только в одном TU, inline - во всех использующих TU с условиями ODR
Matwey
inline как раз говорит что функция не будет нарушать ODR а как дальше компилер ето разрулит - его забота
Ну значит это как раз тот случай, когда inline нужно ставить принудительно.
Constantine
причем то, что inline реализована во всех использующих TU подразумевает "no diagnosis"
Berkus
Ну значит это как раз тот случай, когда inline нужно ставить принудительно.
но насколько я помню, функция определенная в ТЕЛЕ класса в хедере будет автоматически помечена инлайн
Berkus
а вот за пределами класса - надо ставить
Berkus
иначе будет нарушение ODR
Constantine
но насколько я помню, функция определенная в ТЕЛЕ класса в хедере будет автоматически помечена инлайн
если функция реализуется в теле класса, то она автоматически помечается как inline если функция constexpr то функция автоматически помечается как inline
Berkus
#pragma once class A { void f(); }; inline void A::f() {} // реализуется вне тела класса class B { void f() {} // реализуется в теле класса }; обе inline (при этом компилятор не обязан их инлайнить)
Constantine
при этом MSVC++2015 не проверяет, что inline функция-член класса реализована в использующем TU
Constantine
в случае с функцией-членом классом точно разрешено указывать inline только реализации
Constantine
в остальных - не уверен)
Berkus
это приводит к непредсказуемым ошибкам компиляции
*комментарий про индусов в зоопарке*