Я работаю над небольшим проектом, чтобы лучше понять цепочку компилятора и компоновщика.
Предположим, у меня есть библиотеки libfoo.a
и libbar.a
.Я хочу создать библиотеку libmy.a
, которая действует как оболочка или API верхнего уровня для обеих библиотек.Цель состоит в том, чтобы для сборки исполняемого файла требовалось только libmy.a
, которое использует мои определенные функции-оболочки.Я создал проект cmake и настроил библиотеку
cmake_minimum_required(VERSION 3.14)
project(Wrapper)
set(CMAKE_CXX_STANDARD 11)
add_library(my STATIC ${SOME_SRC_FILES})
#set up the lib/inc paths and libs to link
target_include_directories(my PUBLIC /path/to/Foo/inc/ /path/to/Bar/inc/)
target_link_directories(my PUBLIC /path/to/Foo/lib/ /path/to/Bar/lib)
target_link_libraries(my PUBLIC foo bar)
, которая отлично работает и нет проблем при компиляции.Однако, если я пытаюсь ссылаться на объект из внешнего проекта, он говорит мне, что у меня есть неопределенные ссылки на функции в libfoo.a
и libbar.a
.Насколько я понимаю проблема, компоновщик создает объявление только в libmy.a, не включая его определение из внешней библиотеки.Я проверил это, открыв libmy.a
с помощью команды nm libmy.a
, где используемые функции внешних библиотек объявлены, но не определены.
Я столкнулся с одним решением, которое использовало ar
для объединения нескольких файлов библиотеки.Однако я хотел бы избежать таких методов, потому что, если это не отдельная библиотека, а группа, скажем, из 10 библиотек, не подходит для поиска в каждой библиотеке определения и копирования его в libmy.a
.Простое объединение всех библиотек также не является решением, поскольку файл станет слишком большим.
Важно отметить, что один из этих библиотечных пакетов - CUDA?
Я уверенесть решение, но я не смог его найти.Любая помощь будет оценена