Статическая библиотека стороннего разработчика
Итак, все начинается с Сторонняя статическая библиотека, созданная за пределами Мезон с 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'
Цель здесь состоит в том, чтобы сторонний .a полностью находился внутри моего .so, а мои программы включали только +ссылку последний. (Фактическая цель состоит в том, чтобы сделать последнюю оболочкой C API, подключаемой через dyn, для библиотеки C++, подключаемой по дизайну, а не через dyn.)
Я все еще немного новичок. в Meson и создании многобиблиотековых проектов C/C++, так что, думаю, я ожидал, что все символы, существующие внутри .a, будут как бы вставлены в .so процессом под названием "static". связывание». Это «в принципе не так», или мой meson.build нуждается в дальнейших настройках?
Подробнее здесь: https://stackoverflow.com/questions/793 ... -with-an-e