Неправильный заказ флагов Cmake с использованием target_link_libraries, target_compile_optionsC++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Неправильный заказ флагов Cmake с использованием target_link_libraries, target_compile_options

Сообщение Anonymous »

У меня есть библиотека интерфейсов cxx_opts в cmake, который определяет кучу флагов и двоичный main , который использует библиотеку cxx_opts .

Код: Выделить всё

cmake_minimum_required(VERSION 3.16)
project(test LANGUAGES CXX)

add_library(cxx_opts INTERFACE)
target_compile_options(cxx_opts INTERFACE
-Wall -Wpedantic -Wextra -Werror
)

add_executable(main main.cpp)
target_link_libraries(main PRIVATE cxx_opts)
target_compile_options(main PRIVATE -Wno-unused-variable)
Для полноты my main.cpp очень прост:

Код: Выделить всё

int main() {
int unused_variable{};
}
< /code>
i затем настроить этот проект и генерировать базу данных компиляции с помощью этой команды: < /p>
cmake -D CMAKE_EXPORT_COMPILE_COMMANDS=ON  -S . -B build
< /code>
Если я теперь создаю этот код, я получаю ошибку: < /p>
cmake --build build
< /code>
main.cpp:2:9: error: unused variable 'unused_variable' [-Werror,-Wunused-variable]
2 |     int unused_variable{};
|         ^~~~~~~~~~~~~~~
Я ожидаю, что, поскольку я добавляю флаг-wno-un-unued-variable к основной цели , предупреждение не должно запускать, и все же это так и делает и рассматривается как ошибка. < /p>
Если я теперь осмотрю базу данных компиляции, сгенерированную в результате шага конфигурации (очищен от неважных вещей), я вижу, что Заказ флагов неверно :

Код: Выделить всё

[
{
"directory": "test_project/build",
"command": "c++ -Wno-unused-variable -Wall -Wpedantic -Wextra -Werror -o CMakeFiles/main.dir/main.cpp.o -c test_project/main.cpp",
"file": "test_project/main.cpp"
}
]
ПРИМЕЧАНИЕ. . Я также являюсь заядлым пользователем Cmake и испытывал впечатление, что этого никогда не должно произойти. Отсюда, документы Cmake, кажется, говорят следующее: < /p>

Если предварительно указано, содержимое будет приготовлено к собственности, а не добавляется. < / / p>
< /blockquote>

повторяющиеся вызовы для тех же элементов добавления в вызываемом порядке. < /p>
< /blockquote>
Чтобы проверить приведенный выше оператор, я активно добавил флаг -WNO-uly-viable в CXX_OPTS целевой непосредственно с теми же результатами, он все еще появляется до остальных. Итак, что-то активно переказывает флаги в результирующей команде.

Код: Выделить всё

target_compile_options(cxx_opts INTERFACE
-Wall -Wpedantic -Wextra -Werror
)
target_compile_options(cxx_opts INTERFACE -Wno-unused-variable)
< /code>
Ошибка здесь происходит на моем Mac, так что, может быть, она связана с Mac? Кто -нибудь знает, что здесь происходит и что я могу сделать, чтобы исправить порядок флагов? Вместо этого может сделать это, что должно гарантировать порядок флагов (я еще не уверен в этом на 100%): < /p>
cmake_minimum_required(VERSION 3.16)
project(test LANGUAGES CXX)

add_library(cxx_opts INTERFACE)
target_compile_options(cxx_opts INTERFACE
-Wall -Wpedantic -Wextra -Werror
)

add_library(custom_flags INTERFACE)
target_compile_options(custom_flags INTERFACE -Wno-unused-variable)

add_executable(main main.cpp)
target_link_libraries(main PRIVATE cxx_opts custom_flags)
ПРИМЕЧАНИЕ, как мы должны создать еще одну целевую целевую custom_flags и связать его After the Cxx_opts для флагов из custom_flags цель появиться после из CXX_OPTS Target. Есть ли лучший (более идиоматический) способ?


Подробнее здесь: https://stackoverflow.com/questions/794 ... le-options
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»