CMake, статическая библиотека и оптимизация времени компоновки

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

set(
    CMAKE_CXX_FLAGS
        "${CMAKE_CXX_FLAGS} -Wall -Werror -Wextra -pedantic -std=c++11"
)

if (CMAKE_COMPILER_IS_GNUCXX)
    set(
        CMAKE_STATIC_LINKER_FLAGS_RELEASE
            "${CMAKE_STATIC_LINKER_FLAGS_RELEASE} -flto -fwhole-program"
    )
endif()

add_library(
    mylib STATIC
        mylib.cpp
)

Но при обычном запуске

cmake -DCMAKE_BUILD_TYPE=Release ..
make

Я получаю следующую ошибку:

/usr/bin/ar: two different operation options specified

Файл link.txt содержит следующие команды:

/usr/bin/ar cq libmylib.a  -flto -fwhole-program CMakeFiles/mylib.cpp.o
/usr/bin/ranlib libmylib.a

Из того, что я понял из запуска ar --help, -flto -fwhole-program должно быть перед libmylib.a в первой строке. Но я понятия не имею, как заставить CMake поместить его туда.

Верно ли мое предположение? И как я могу это решить?

РЕДАКТИРОВАТЬ: я хотел бы добавить, что я совершенно новичок в использовании LTO, поэтому, если нет смысла использовать его для статических библиотек, скажите мне об этом.


person graywolf    schedule 24.07.2015    source источник
comment
в документации GCC указано: -fwhole-program ... Этот параметр должен нельзя использовать в сочетании с -flto.   -  person m.s.    schedule 25.07.2015
comment
в другой части говорится, что если программа не требует экспорта каких-либо символов, можно объединить -flto и -fwhole-program, чтобы позволить межпроцедурным оптимизаторам использовать более агрессивные предположения, которые могут привести к улучшенным возможностям оптимизации. Нужна ли статическая библиотека экспортировать какие-либо символы? извините за наверное глупый вопрос   -  person graywolf    schedule 25.07.2015
comment
Я не могу помочь с частью оптимизации библиотеки, но если вы просто хотите изменить командную строку ar, см. CMAKE_CXX_ARCHIVE_CREATE. Таким образом, вы можете добавить set(CMAKE_CXX_ARCHIVE_APPEND "<CMAKE_AR> cq -flto -fwhole-program <TARGET> <LINK_FLAGS> <OBJECTS>") перед вашей командой project() или, что лучше, в файле набора инструментов для GNU (CMAKE_COMPILER_IS_GNUCXX недействителен до project()). Подробнее см. здесь.   -  person Florian    schedule 27.07.2015
comment
мой CMakeLists предназначен для подпапки src, project() определен в корне CMakeLists .. большое спасибо за ваш совет, можете ли вы опубликовать его как ответ? Я попробую, когда вернусь с работы, и соглашусь, если работаю. И спасибо, что упомянули toolchain file, будем читать дальше на эту тему   -  person graywolf    schedule 27.07.2015


Ответы (1)


-flto не является допустимым вариантом для ar. Вместо этого вы должны использовать эти флаги для CMAKE_EXE_LINKER_FLAGS.

person bb94    schedule 17.02.2017