Зависимость переходной библиотеки в Premake? - PullRequest
0 голосов
/ 26 сентября 2019

У меня проблема с правильным связыванием библиотек с моими проектами с использованием gmake и premake5 (в Linux, elementaryOS).Я использую premake для генерации make-файлов.У меня есть 3 проекта в моей рабочей области: glfw (библиотека, с которой я хочу связать), Celer (библиотека, над которой я хотел начать работать, она должна быть связана с glfw) и Sandbox (мое приложение для тестирования).Связывание между Sandbox и Celer работает без проблем, но когда я пытаюсь связать Celer и glfw, возникают неопределенные ссылки, и я просто не могу понять, почему.

==== Building glfw (debug) ====
==== Building Celer (debug) ====
==== Building Sandbox (debug) ====
Linking Sandbox
../../bin/linux-Debug-x86_64/Celer/libCeler.a(Window.o): In function `Celer::Window::Window()':
/home/daniel/Documents/Development/C++/celer-engine/src/celer/Graphics/Window.cpp:6: undefined reference to `glfwInit'
/home/daniel/Documents/Development/C++/celer-engine/src/celer/Graphics/Window.cpp:11: undefined reference to `glfwDefaultWindowHints'
/home/daniel/Documents/Development/C++/celer-engine/src/celer/Graphics/Window.cpp:12: undefined reference to `glfwCreateWindow'
/home/daniel/Documents/Development/C++/celer-engine/src/celer/Graphics/Window.cpp:19: undefined reference to `glfwSwapInterval'
../../bin/linux-Debug-x86_64/Celer/libCeler.a(Window.o): In function `Celer::Window::update()':
/home/daniel/Documents/Development/C++/celer-engine/src/celer/Graphics/Window.cpp:29: undefined reference to `glfwSwapBuffers'
collect2: error: ld returned 1 exit status
Makefile:78: recipe for target '../../bin/linux-Debug-x86_64/Sandbox/Sandbox' failed
make[1]: *** [../../bin/linux-Debug-x86_64/Sandbox/Sandbox] Error 1
Makefile:45: recipe for target 'Sandbox' failed
make: *** [Sandbox] Error 2

Я знаю, что, вероятно, есть тысячи вопросов, связанных со ссылками, но я сейчас потратил так много времени на исследования, и до сих пор не могу понять проблему.

У меня естьнастроил репозиторий GitHub со всеми файлами premake и make: репозиторий GitHub

Вот что выполняет make:

echo "==== Building glfw (debug) ===="
make --no-print-directory -C lib/glfw -f Makefile config=debug
:
echo "==== Building Celer (debug) ===="
make --no-print-directory -C src/celer -f Makefile config=debug
:
echo "==== Building Sandbox (debug) ===="
make --no-print-directory -C test/sandbox -f Makefile config=debug
echo Linking Sandbox
g++ -o "../../bin/linux-Debug-x86_64/Sandbox/Sandbox"  ../../build/linux-Debug-x86_64/Sandbox/Sandbox.o   -L/usr/lib64 -m64 ../../bin/linux-Debug-x86_64/Celer/libCeler.a
:

Ответы [ 2 ]

1 голос
/ 26 сентября 2019

Ах, я не заметил, что вы используете статические библиотеки.Как сказал Томас Саблик , статические библиотеки не содержат своих зависимостей, их нужно переносить на себя.Поэтому вам нужно изменить свой проект Sandbox с ...

links { "Celer" }

на что-то более похожее на ...

links { 
   "glfw",
   "Xrandr",
   "Xi",
   "GLU",
   "GL",
   "X11",
   "dl",
   "pthread",
   "stdc++fs",
   "Celer"
} 
0 голосов
/ 27 сентября 2019

Мне удалось собрать проект с помощью CMake.Сначала я изменил текущий рабочий каталог на lib / glfw / build.Я очищаю каталог с помощью

rm -rf *

, настраиваю и собираю проект с

cmake -DGLFW_BUILD_DOCS=false -DGLFW_BUILD_EXAMPLES=false -DGLFW_BUILD_TESTS=false -DGLFW_INSTALL=false ..
cmake --build .

Затем я создал CMakeLists.txt, содержащий

cmake_minimum_required(VERSION 3.0)

project(Celer)

add_library(Celer src/celer/Graphics/Window.cpp src/celer/Debug/Logger.cpp)
target_include_directories(Celer PRIVATE lib/glfw/include)

add_executable(Sandbox test/sandbox/Sandbox.cpp)
target_include_directories(Sandbox PRIVATE src/celer)
target_link_directories(Sandbox PRIVATE lib/glfw/build/src/)
target_link_libraries(Sandbox PRIVATE Celer glfw3 dl X11 pthread)

в корневашего проекта.Я изменил cwd на build, очистил его и собрал проект с

cmake ..
cmake --build .

Он работал как положено.Необходимо связать Sandbox со всеми указанными библиотеками, иначе он не будет собран.

Вы можете добавить сборку glfw в свой проект с помощью

cmake_minimum_required(VERSION 3.0)

project(Celer)

set(GLFW_BUILD_EXAMPLES false)
set(GLFW_BUILD_TESTS false)
set(GLFW_BUILD_DOC false)
set(GLFW_INSTALL false)
add_subdirectory(lib/glfw)

add_library(Celer src/celer/Graphics/Window.cpp src/celer/Debug/Logger.cpp)
target_include_directories(Celer PRIVATE lib/glfw/include)

add_executable(Sandbox test/sandbox/Sandbox.cpp)
target_include_directories(Sandbox PRIVATE src/celer)
target_link_directories(Sandbox PRIVATE lib/glfw/build/src/)
target_link_libraries(Sandbox PRIVATE Celer glfw3 dl X11 pthread)

Проблема в конфигурации сборкиВозможно, вы пытаетесь связать Celer со всеми зависимостями, но статическая библиотека не может быть связана.Вы должны связать Sandbox с зависимостями или использовать динамическую библиотеку.

...