из исходников собиралась статическая либа и все вызовы функций внутри нее были разрешены. Сама либа собирается. При попытке использовать ее в каком-то 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
                  
                  
                
Там у тебя нет "attribbute((visibilty, <something>)) в коде?
 Michael
                          
                        
                      
                    
                    
                    
                    
                      Автор вопроса
                      
                      
                        
                          Michael
                          
                        
                      
                    
                    
                    
                    
                      Автор вопроса
                    
                    
                  нет, тупо хедеры с объявлениями и .cpp с определениями
Мне нужно чтобы из исходников собиралась статическая либа и все вызовы функций внутри нее были разрешены. Сама либа собирается Внутри стат либы символы не разрешаются
Проверь по логам cmake - а точно ли линкуется cm3d к твоей либе правильно, она же должна потом линковаться и к приложению.
Вы не можете линковать статик либу к статик либе. Обе либы нужно потом линковать к исполняемому файлу
Почему нет? Перепаковать файлы из двух архивов в один уже нельзя? Оо
 Michael
                          
                        
                      
                    
                    
                    
                    
                      Автор вопроса
                      
                      
                        
                          Michael
                          
                        
                      
                    
                    
                    
                    
                      Автор вопроса
                    
                    
                  нет, как раз уже проверил link.txt делает только ar -ql (или -qr) myobj1.o myobj2.o
 Michael
                          
                        
                      
                    
                    
                    
                    
                      Автор вопроса
                      
                      
                        
                          Michael
                          
                        
                      
                    
                    
                    
                    
                      Автор вопроса
                    
                    
                  никаких -l там нет
 Michael
                          
                        
                      
                    
                    
                    
                    
                      Автор вопроса
                      
                      
                        
                          Michael
                          
                        
                      
                    
                    
                    
                    
                      Автор вопроса
                    
                    
                  Ну это да. Но при линкове основной либы к запускаемому файлу или динамической либе - должны слинковаться все зависимости, все что было указано у либы в target_link_libraries PUBLIC
Но odr же можно получить и при линьковке двух статических либ в исполняемый файл, если в этих либах есть символы с одинаковым именем?
Каковы шансы получить 2 статических либы с одинаковыми символами, если одна либа включена в другую?
Шансы одинаковые, так как эта вероятность не зависит от порядка линьковки, а зависит только от самих либ. Если в двух статических либах оказались одинаковые символы, то ODR будет, как их не линькуй в exe ли сразу или переупаковав в одну и потом в exe. Если в двух либах нет одинаковых символов, то ODR не возникнет опять-же вне зависимости от способа линьковки.
Представьте что либу вам дал подрядчик/иной разработчик/откуда-то вообще возникла. Вы будете сильно удивлены, что в неё уже включена та же самая либа, которая используется у вас в проекте, но другой версии? Я бы удивился.
Еще раз, если это статические библиотеки, то опасность ODR не зависит от порядка сборки. Если это динамические библиотеки, то там есть видимость/экспорт и внутренние зависимости могут быть скрыты внутри и никак не проявить себя по ODR.
то есть линковать статик либы в статик либы можно и нужно? и это нормальная практика, и так делать хорошо? А то я пытаюсь объяснить почему это плохо, ибо вопрос изначально был про встраивание статик либы в статик либы, а вы говорите - "да не, всё норм, так и так можно накосячить"
Вы в качестве аргумента приводите риск, который не зависит от способа. Я вам пришу ровно об этом. Если уж хотите действительно объяснить, почему это плохо, то приводите реальные аргументы, что реально будет хуже. Про часть, которая в кавычках я даже говорить не хочу, ибо это исключительно ваша фантазия.
Обсуждают сегодня