aerys / minko

3D framework for web, desktop and mobile devices.
http://minko.io
Other
905 stars 210 forks source link

Plugin linking order causes errors with clang #173

Closed martonperei closed 10 years ago

martonperei commented 10 years ago

I'm using clang version 3.4-1ubuntu3 and I'm getting undefined references when linking plugins. If i reorder the linked libraries so plugins are listed first, everything works fine. Clang does not seem to support --start-group and --end-group.

We could pass the plugins in the minko.project.application call and enable them before linking the minko framework:

minko.project.application("minko-tutorial-" .. PROJECT_NAME, {"sdl", "lua"})

and

minko.project.application = function(name, plugins)

    minko.project.library(name)

    kind "WindowedApp"

    if plugins ~= nil then
        for _, plugin in pairs(plugins) do
            minko.plugin.enable(plugin)
        end
    end

...

The error:

Linking minko-tutorial-12-working-with-normal-maps
../../plugin/sdl/bin/linux64/release/libminko-plugin-sdl.a(Canvas.o): In function `minko::Canvas::initializeContext(std::string const&, unsigned int, unsigned int, bool)':
src/minko/Canvas.cpp:(.text+0xc9c): undefined reference to `minko::render::OpenGLES2Context::OpenGLES2Context()'
../../plugin/sdl/bin/linux64/release/libminko-plugin-sdl.a(Canvas.o): In function `minko::Canvas::initializeInputs()':
src/minko/Canvas.cpp:(.text+0x1181): undefined reference to `minko::input::Keyboard::Keyboard()'
../../plugin/sdl/bin/linux64/release/libminko-plugin-sdl.a(Canvas.o): In function `minko::Canvas::step()':
src/minko/Canvas.cpp:(.text+0x4c37): undefined reference to `minko::async::Worker::update()'
../../plugin/sdl/bin/linux64/release/libminko-plugin-sdl.a(Canvas.o): In function `minko::Canvas::SDLKeyboard::SDLKeyboard()':
src/minko/Canvas.cpp:(.text+0x5658): undefined reference to `minko::input::Keyboard::Keyboard()'
../../plugin/sdl/bin/linux64/release/libminko-plugin-sdl.a(Canvas.o): In function `minko::async::FileLoaderWorker::FileLoaderWorker()':
src/minko/Canvas.cpp:(.text._ZN5minko5async16FileLoaderWorkerC2Ev[_ZN5minko5async16FileLoaderWorkerC2Ev]+0x24): undefined reference to `minko::async::Worker::Worker(std::string const&)'
src/minko/Canvas.cpp:(.text._ZN5minko5async16FileLoaderWorkerC2Ev[_ZN5minko5async16FileLoaderWorkerC2Ev]+0x3e): undefined reference to `vtable for minko::async::FileLoaderWorker'
../../plugin/sdl/bin/linux64/release/libminko-plugin-sdl.a(Canvas.o): In function `minko::Canvas::SDLJoystick::SDLJoystick(std::shared_ptr<minko::Canvas>, int, _SDL_Joystick*)':
src/minko/Canvas.cpp:(.text._ZN5minko6Canvas11SDLJoystickC2ESt10shared_ptrIS0_EiP13_SDL_Joystick[_ZN5minko6Canvas11SDLJoystickC2ESt10shared_ptrIS0_EiP13_SDL_Joystick]+0x51): undefined reference to `minko::input::Joystick::Joystick(std::shared_ptr<minko::AbstractCanvas>, int)'
../../plugin/sdl/bin/linux64/release/libminko-plugin-sdl.a(Canvas.o): In function `minko::Canvas::SDLMouse::SDLMouse(std::shared_ptr<minko::Canvas>)':
src/minko/Canvas.cpp:(.text._ZN5minko6Canvas8SDLMouseC2ESt10shared_ptrIS0_E[_ZN5minko6Canvas8SDLMouseC2ESt10shared_ptrIS0_E]+0x44): undefined reference to `minko::input::Mouse::Mouse(std::shared_ptr<minko::AbstractCanvas>)'
clang: error: linker command failed with exit code 1 (use -v to see invocation)
warrenseine commented 10 years ago

We've encountered this issue with Emscripten (based on Clang), which is why we have this terrible workaround (passing libraries twice).

Your solution works in some places, but not everywhere, as some projects enable libraries dynamically based on context.

Making a wrapper around Clang injecting libraries twice should be the (ugly) way to go.

martonperei commented 10 years ago

Thanks! Seems to work fine.