Я пытаюсь создать статическую библиотеку с оптимизацией времени ссылки, используя 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, поэтому, если нет смысла использовать его для статических библиотек, скажите мне об этом.
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.2015project()
определен в корне CMakeLists .. большое спасибо за ваш совет, можете ли вы опубликовать его как ответ? Я попробую, когда вернусь с работы, и соглашусь, если работаю. И спасибо, что упомянулиtoolchain file
, будем читать дальше на эту тему - person graywolf   schedule 27.07.2015