Мезон: попытка статически связать `.a` с `.so` (который dyn-связывает с exe) приводит к бесчисленным ошибкам компоновщикC++

Программы на C++. Форум разработчиков
Ответить Пред. темаСлед. тема
Anonymous
 Мезон: попытка статически связать `.a` с `.so` (который dyn-связывает с exe) приводит к бесчисленным ошибкам компоновщик

Сообщение Anonymous »

TL;DR: попытка статически связать предварительно созданную стороннюю библиотеку lib с моей собственной общей библиотекой, связанной с помощью dyn, вызывает лавину неопределенных ссылок< /code> ошибки из ld.
Статическая библиотека стороннего разработчика
Итак, все начинается с Сторонняя статическая библиотека, созданная за пределами Мезон с CMake, с -DCMAKE_POSITION_INDEPENDENT_CODE=ON -DCMAKE_EXPORT_COMPILE_COMMANDS=ON. Эта библиотека встраивает большую часть своих собственных сторонних зависимостей напрямую (в виде «вставленных исходных файлов», если хотите) в свой репозиторий (Lua, Jolt и другие) — и, следовательно, также в окончательный вывод сборки libWickedEngine_Linux.a размером 184 МБ. (известен благодаря сгенерированному CMake файлу compile_commands.json, а также потому, что при его запуске не возникает проблем, описанных ниже. статически связан непосредственно с исполняемым файлом() вместо приведенного ниже .so).
Сказал, что libWickedEngine_Linux.a существует в моем meson.build< /code> например:

Код: Выделить всё

dep_wicked = meson.get_compiler('cpp').find_library(
'WickedEngine_Linux',
dirs: [meson.project_source_root() / '.wi/build/WickedEngine'],
header_include_directories: include_directories('.wi/WickedEngine'),
required: true,
static: true,
)
Моя общая библиотека
Предполагается, что она статически связывается с окончательными выводами сборки .so полностью соответствует приведенному выше .a . Он #include "entry-point .h" из-above-3rd-party-lib в свой собственный единственный файл .cpp, предназначенный для простого helloworlding, и выглядит следующим образом:

Код: Выделить всё

lib_cwicked = library(
'cwicked',
dependencies: [dep_wicked, dep_sdl2],
include_directories: include_directories('.wi/WickedEngine'),
sources: ['src/cWicked.cpp'],
)
Окончательный тестовый исполняемый файл
Просто файл main.c, который #includeвключает только мои указанные выше общие библиотеки собственный .h и вызов его helloworld.

Код: Выделить всё

executable(
'cWickedDemo.exec',
dependencies: [dep_sdl2],
link_with: [lib_cwicked],
sources: ['src/demo/main.c'],
)
Проблема:
Теперь, когда я компилирую мезон в моем meson.build (что на самом деле просто 3 приведенные выше части в кавычках имеют префикс project('cWicked', ['cpp', 'c']) и dep_sdl2 = dependency('SDL2', include_type: 'system', static: false) ), только после шага связывания целевого объекта libcwicked.so я получаю всевозможные неопределенные ссылки на ошибки '' по ld, 100 или 1000, но все равно заполняю терминал. Небольшая выдержка:

Код: Выделить всё

/usr/bin/ld: /home/_/c/c/cWicked/.wi/WickedEngine/wiLuna.h:124:(.text.unlikely+0x3a2): undefined reference to `lua_pushnumber'
/usr/bin/ld: /home/_/c/c/cWicked/.wi/WickedEngine/wiLuna.h:125:(.text.unlikely+0x3ad): undefined reference to `lua_settable'
/usr/bin/ld: /home/_/c/c/cWicked/.wi/build/WickedEngine/libWickedEngine_Linux.a(wiLoadingScreen_BindLua.cpp.o): in function `Luna::gc_obj(lua_State*)':
/home/_/c/c/cWicked/.wi/WickedEngine/wiLuna.h:283:(.text._ZN4LunaIN2wi3lua21LoadingScreen_BindLuaEE6gc_objEP9lua_State[_ZN4LunaIN2wi3lua21LoadingScreen_BindLuaEE6gc_objEP9lua_State]+0x19): undefined reference to `lua_touserdata'
/usr/bin/ld: /home/_/c/c/cWicked/.wi/build/WickedEngine/libWickedEngine_Linux.a(wiLoadingScreen_BindLua.cpp.o): in function `Luna::constructor(lua_State*)':
/home/_/c/c/cWicked/.wi/WickedEngine/wiLuna.h:145:(.text._ZN4LunaIN2wi3lua21LoadingScreen_BindLuaEE11constructorEP9lua_State[_ZN4LunaIN2wi3lua21LoadingScreen_BindLuaEE11constructorEP9lua_State]+0x103): undefined reference to `lua_newuserdata'
/usr/bin/ld: /home/_/c/c/cWicked/.wi/WickedEngine/wiLuna.h:148:(.text._ZN4LunaIN2wi3lua21LoadingScreen_BindLuaEE11constructorEP9lua_State[_ZN4LunaIN2wi3lua21LoadingScreen_BindLuaEE11constructorEP9lua_State]+0x11a): undefined reference to `lua_getfield'
Но это касается не только Lua, можно сказать, что прокрутка вверх в терминале: то же самое можно сказать и о многих других сторонних библиотеках. > встроенный сторонний код.
Цель здесь состоит в том, чтобы сторонний .a полностью находился внутри моего .so, а мои программы включали только +ссылку последний. (Фактическая цель состоит в том, чтобы сделать последнюю оболочкой C API, подключаемой через dyn, для библиотеки C++, подключаемой по дизайну, а не через dyn.)
Я все еще немного новичок. в Meson и создании многобиблиотековых проектов C/C++, так что, думаю, я ожидал, что все символы, существующие внутри .a, будут как бы вставлены в .so процессом под названием "static". связывание». Это «в принципе не так», или мой meson.build нуждается в дальнейших настройках?

Подробнее здесь: https://stackoverflow.com/questions/793 ... -with-an-e
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C++»