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 ответов

54 просмотра

Там у тебя нет "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

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.
то есть линковать статик либы в статик либы можно ...

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

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

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

30500 за редактор? )
Владимир
47
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
вы делали что-то подобное и как? может есть либы готовые? увидел картинку нокода, где всё линиями соединено и стало интересно попробовать то же в ddl на lua сделать. решил с ч...
Victor
8
Подскажите пожалуйста, как в CustomDrawCell(Sender: TcxCustomGridTableView; ACanvas: TcxCanvas; AViewInfo: TcxGridTableDataCellViewInfo; var ADone: Boolean); получить наз...
A Z
7
Ребят в СИ можно реализовать ООП?
Николай
33
https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_h_common.erl#L174 https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_olp.erl#L76 15 лет назад...
Maksim Lapshin
20
Как передать управляющий символ в открытую через CreateProcess консоль? Собсна, есть процедура: procedure TRedirectThread.WriteData(Data: OEMString); var Written: Cardinal;...
Serjone
1
Он в одиночку это дело запилил или была какая-то команда?
Aquinary
12
~ 2m21s  nix shell github:nixos/nixpkgs#stack ~  stack ghc -- --version error: … while calling the 'derivationStrict' builtin at /builtin/derivation.nix:...
Rebuild your mind.
6
Всем привет, нужна как никогда, нужна помощь с IO в загрузчике. Пишу в code16 после установки сегментных регистров, пишу вывод символа. Пробовал 2 варианта: # 1 mov $0x0E, %a...
Shadow Akira
14
Карта сайта