207 похожих чатов

Подскажите пж что за бред со стороны cmake Мне нужно чтобы

из исходников собиралась статическая либа и все вызовы функций внутри нее были разрешены. Сама либа собирается. При попытке использовать ее в каком-то executable вылетают ошибки линковки: RenderSurface.cpp:45: undefined reference to `cm3d::Utility::GL::ShaderProgram::compile(...)
Этот символ находится в cm3dutil_gl и я линкую эту либу здесь. Когда я вместо этого линкую ее напрямую к конечному исполняемому файлу, ошибка пропадает. Т.е. последнюю строчку кода смак можно закомментировать и линковка выглядит абсолютно так же. PRIVATE/PUBLIC/INTERFACE в target_link_libraries никак не влияет на это дело. Можно как-то решить?

сам код для сборки либы:
set (fiercewild_SOURCES
Fiercewild.cpp
"Modules/RenderSurface.cpp"
"${CM3D_EXTERNAL_ROOT}/glad/src/gl.c"
)
add_library(fiercewild STATIC ${fiercewild_SOURCES})
add_dependencies(fiercewild cm3dutil_gl)
set_target_properties(fiercewild PROPERTIES RUNTIME_OUTPUT_DIRECTORY ${CM3D_RUNTIME_OUTPUT_DIR})
target_include_directories(fiercewild PRIVATE ${CM3D_INTERNAL_INCDIRS})
target_link_libraries(fiercewild PUBLIC ${CM3D_INTERNAL_GLFW_LIBS} "$<TARGET_FILE:cm3dutil_gl>")

собираю на линухе, clang 16

17 ответов

15 просмотров

Там у тебя нет "attribbute((visibilty, <something>)) в коде?

Michael- Автор вопроса
Mikhail
Там у тебя нет "attribbute((visibilty, <something>...

нет, тупо хедеры с объявлениями и .cpp с определениями

Мне нужно чтобы из исходников собиралась статическая либа и все вызовы функций внутри нее были разрешены. Сама либа собирается Внутри стат либы символы не разрешаются

Проверь по логам cmake - а точно ли линкуется cm3d к твоей либе правильно, она же должна потом линковаться и к приложению.

Michael Chambers
Мне нужно чтобы из исходников собиралась статическ...

Вы не можете линковать статик либу к статик либе. Обе либы нужно потом линковать к исполняемому файлу

S.E.
Вы не можете линковать статик либу к статик либе. ...

Почему нет? Перепаковать файлы из двух архивов в один уже нельзя? Оо

Michael- Автор вопроса
Александр Водянников
Проверь по логам cmake - а точно ли линкуется cm3d...

нет, как раз уже проверил link.txt делает только ar -ql (или -qr) myobj1.o myobj2.o

Michael- Автор вопроса
Michael- Автор вопроса
S.E.
Вы не можете линковать статик либу к статик либе. ...

Ну это да. Но при линкове основной либы к запускаемому файлу или динамической либе - должны слинковаться все зависимости, все что было указано у либы в target_link_libraries PUBLIC

Но odr же можно получить и при линьковке двух статических либ в исполняемый файл, если в этих либах есть символы с одинаковым именем?

Vladislav Shchapov
Но odr же можно получить и при линьковке двух стат...

Каковы шансы получить 2 статических либы с одинаковыми символами, если одна либа включена в другую?

S.E.
Каковы шансы получить 2 статических либы с одинако...

Шансы одинаковые, так как эта вероятность не зависит от порядка линьковки, а зависит только от самих либ. Если в двух статических либах оказались одинаковые символы, то ODR будет, как их не линькуй в exe ли сразу или переупаковав в одну и потом в exe. Если в двух либах нет одинаковых символов, то ODR не возникнет опять-же вне зависимости от способа линьковки.

Vladislav Shchapov
Шансы одинаковые, так как эта вероятность не завис...

Представьте что либу вам дал подрядчик/иной разработчик/откуда-то вообще возникла. Вы будете сильно удивлены, что в неё уже включена та же самая либа, которая используется у вас в проекте, но другой версии? Я бы удивился.

S.E.
Представьте что либу вам дал подрядчик/иной разраб...

Еще раз, если это статические библиотеки, то опасность ODR не зависит от порядка сборки. Если это динамические библиотеки, то там есть видимость/экспорт и внутренние зависимости могут быть скрыты внутри и никак не проявить себя по ODR.

то есть линковать статик либы в статик либы можно и нужно? и это нормальная практика, и так делать хорошо? А то я пытаюсь объяснить почему это плохо, ибо вопрос изначально был про встраивание статик либы в статик либы, а вы говорите - "да не, всё норм, так и так можно накосячить"

S.E.
то есть линковать статик либы в статик либы можно ...

Вы в качестве аргумента приводите риск, который не зависит от способа. Я вам пришу ровно об этом. Если уж хотите действительно объяснить, почему это плохо, то приводите реальные аргументы, что реально будет хуже. Про часть, которая в кавычках я даже говорить не хочу, ибо это исключительно ваша фантазия.

Похожие вопросы

Обсуждают сегодня

а зачем этот вопрос для удаления из чата?
Mёdkinson Medvezhkin
63
Эх кто-то пришел и весь праздник испортил :( You need complex FBX scene importing setup to change things on import? good luck with that. You need navigation and pathfinding? g...
Serg Gini
5
Всем привет! Подскажите. Я написал приложение на Delphi 10.2 Tokyo под Windows 10. И передо мной стал вопрос о том чтобы сделать это приложение кроссплатформенным (под Linux и...
Дмитрий Завгородний
24
Какого хера? /Sources/App/Modules/User/Models/UserLinkApple.swift:21:20: warning: stored property '_id' of 'Sendable'-conforming class 'UserLinkApple' is mutable @ID(...
Alexander Sherbakov
12
У тебя в конфиге нигде нет deny all; или вообще любого deny?
Alexander Sherbakov
10
Привет всем. Подскажите где можно посмотреть, какая версия электрон, поддерживает версии windows? Некий changelog. Мне бы желательно, поддержку 7,8,10... latest, как понимаю и...
Anonym Squad
21
Почему стало ломаться на D11? "739002.86400000' is not a valid timestamp" function IncDateTime(aStamp:TTimeStamp;aKind:TTriggerKind;aInterval:Integer):TDateTime; //aStamp = 2...
Катерина Свиридова
8
Портфолио: Зовут меня Александр, мне 36 лет. Город Пушкино. Общий рабочий стаж: ~14 лет Уровень квалификации: Senior Full-stack developer Где прочесть мой код? https://github....
Magic
10
Ребят, чет я уже не догоняю... Крч в коде на асм там происходит нечто вроде a+число (a+1, a+2 и т.д.). Но почему строка lea ecx, [edx+1] работает как a+1?? В edx берется адрес...
Alan 🔝 Бэброу
4
думаешь я не смогу также сделать? мне это просто не удобно
int 💳 𝙖𝙞𝙧 𝙗𝙞𝙜 𝙗𝙤𝙗 🔫 check bio / spam block / AFK / nohello.com / GMT+3
9
Карта сайта