Как скомпилировать библиотеку Linux LTO с поддержкой Premake 5?

ТАКАЯ мудрость, я обращаюсь к тебе. Я пытаюсь создать 64-битную статическую библиотеку, используя LTO с Makefiles и Premake 5 на Ubuntu 16.04 LTS.

Вот сценарий premake, который я использую:

-- premake5.lua
workspace "TestApp"

    location "TestApp" -- The directory of generated files - .sln, etc.
    configurations { "Debug", "Shipping" }
    platforms { "Linux_Static", "Linux_DLL" }
    targetdir "TestApp/Build/%{cfg.platform}/%{cfg.buildcfg}"
    objdir "TestApp/Build/"
    language "C++"

    architecture "x86_64"
    system "linux"

    filter "platforms:*Static"
        kind "StaticLib"

    filter "platforms:*DLL"
        kind "SharedLib"

    filter "kind:SharedLib"
        defines { "TEST_USE_DLL", "TEST_DLL_EXPORT" }

    -- Configuration filters
    configuration "*"
        flags { "ExtraWarnings", "C++14", "MultiProcessorCompile", "ShadowedVariables", "UndefinedIdentifiers" }

    configuration { "Debug" }
        symbols "On"
        defines { "TEST_DEBUG" }
        optimize "Debug"

    configuration "Shipping"
        defines { "TEST_SHIPPING" }
        optimize "Full"
        flags { "LinkTimeOptimization" }
        -- step 1
        --buildoptions "--plugin=$$(gcc --print-file-name=liblto_plugin.so)"

        -- step 2
        --toolset "clang"

        -- step 3
        --premake.tools.gcc.ar = "gcc-ar"

-- Projects
project "TestCore"
    location "TestApp/Core"
    files { "TestApp/Core/*.h", "TestApp/Core/*.cpp" }
    includedirs { "TestApp/" }


project "UnitTests"
    location "TestApp/Tests"
    kind "ConsoleApp"
    links { "TestCore" }
    objdir "TestApp/Tests/Build/"

    files { "TestApp/Tests/UnitTests/*.cpp", "TestApp/ThirdParty/Catch/*" }
    includedirs { "TestApp/ThirdParty/Catch", "TestApp/" }

    removedefines { "TEST_DLL_EXPORT" }

    filter { "platforms:*DLL", "system:linux" }
    runpathdirs { "Build/%{cfg.platform}/%{cfg.buildcfg}" }

"Доставка" является неисправной конфигурацией. Я также собрал весь тестовый проект в zip, чтобы вы могли воспроизвести проблему.

Ошибки, которые у меня возникают при компиляции библиотеки TestCore, являются первыми plugin needed to handle lto object, затем plugin /usr/lib/gcc/x86_64-linux-gnu/5/liblto_plugin.so is not licensed under a GPL-compatible license,

Что мы можем с этим поделать? Если у вас есть какие-либо знания, чтобы заставить его работать с GCC, пожалуйста, помогите.

что бы вы сделали, чтобы воспроизвести ошибки GCC после распаковки zip:

  1. cd testBreaking
  2. premake5 gmake
  3. cd TestApp
  4. make config = shipping_linux_static TestCore (получить ошибку "плагин, необходимый для обработки объекта lto")
  5. Раскомментируйте строку 37 из premake5.lua, чтобы получить сообщение об ошибке "не лицензировано под лицензией, совместимой с GPL"
  6. Раскомментируйте строку 43, чтобы использовать gcc-ar вместо ar, обратите внимание, что она тоже не работает
  7. Использование опции gcc -fuse-linker-plugin не помогает

Еще немного информации о системе:

  • Ubuntu 16.04 LTS
  • gcc 5.4, make 4.1, ar 2.26.1
  • premake 5.0.0-alpha11

Я получил это, работая с Clang. С помощью toolset clang для конфигурации доставки (с использованием LLVM 3.9) библиотека, кажется, компилируется нормально. Но я получил еще одну ошибку:

error adding symbols: Archive has no index; run ranlib to add one

Мне удалось обойти эту проблему, позвонив ranlib Build/Linux_Static/Shipping/libTestCore.a --plugin /usr/lib/llvm-3.9/lib/LLVMgold.so, а затем сделать снова.

Так что это больно работает с использованием Clang.

Я читал, что мог бы создать специальный набор инструментов для предварительного создания для такого рода вещей, потому что рекомендуется заменить все утилиты GNU на их gcc- коллеги (например, gcc-ar вместо ar), но быстро возиться с premake.tools.gcc.ar = "gcc-ar" без результата, я не уверен, что это поможет.

0 ответов

Другие вопросы по тегам