Разница между add_compile_options и add_link_options также помечает поддержку каждого параметра

#c #cmake #compilation #linker #linker-flags

#c #cmake #Сборник #компоновщик #компоновщик-флаги

Вопрос:

Я годами использую .bat файл для создания своих приложений. Недавно переключился на CMake для его элегантности, и я столкнулся с ситуацией, когда мне пришлось угадывать флаги, которые я должен поместить в CMake add_link_options и add_compile_options

Примеры флагов, которые я использовал в своем BAT-файле,

 -s WASM=1 --bind -s MODULARIZE=1
 

И в CMake эти флаги стали (после проб и ошибок),

 add_compile_options("SHELL: -s WASM=1")
add_link_options("SHELL: --bind")
add_link_options("SHELL: -s MODULARIZE=1")
 

Честно говоря, я не могу найти никакой информации о флагах, которые add_link_options и add_compile_options поддерживает.

Я знаю, что такое компоновщик, но теряется, когда дело доходит до add_link_options флагов компоновщика or.

Я привык компилировать все в одну строку, и теперь в CMake все, похоже, включает отдельные шаги.

Комментарии:

1. Ничего. Вы должны использовать не их, а target_* варианты. Но в более общем плане, прочтите хорошее руководство, такое как cliutils.gitlab.io/modern-cmake

2. У меня тоже есть варианты target_ *, и поскольку у меня есть несколько целей, у меня есть общие флаги, которые должны быть разделены между ними. Но в любом случае, будь то целевой или нецелевой, я до сих пор понятия не имею, что делать с флагами.

3. При запуске make clean amp;amp; make VERBOSE=1 он показывает компиляцию и компоновку как два отдельных шага? Отображается ли это --bind в команде компоновщика и WASM=1 в команде компилятора? Команды, выполняемые с -c помощью, являются компиляцией, а не связыванием. Мне кажется, что, возможно, все 3 варианта, которые вы передаете, относятся к фазе компиляции, но я могу ошибаться. Было бы полезно, если бы вы сообщили нам, нормально ли сейчас строится ваш проект, или если есть проблема, в чем она заключается.

Ответ №1:

Я не уверен, в чем ваша проблема, но вот полный рабочий пример из проекта Wasm, который устанавливает строгий режим для всего проекта и отключает поддержку исключений:

 if (EMSCRIPTEN)
    add_compile_options(-fno-exceptions "SHELL:-s STRICT=1")
    add_link_options("SHELL:-s STRICT=1")
endif()
 

Обратите особое внимание, что, поскольку он имеет [compile link] маркер в настройках emscripten, -s STRICT=1 он должен использоваться как для компиляции, так и для компоновки, поэтому он появляется в каждом.

Проблема if(EMSCRIPTEN) в том, что этот проект также может быть создан для Windows и Linux.

Комментарии:

1. в то время как -s STRICT=1 ведет себя так, что другие флаги нельзя использовать таким образом. Мне просто нужно знать, какие флаги я должен передать на этапах компиляции и компоновки.

2. Просто найдите их в документации. Документация Clang находится здесь: clang.llvm.org/docs/ClangCommandLineReference.html и документация по флагам emscripten находится здесь: github.com/emscripten-core/emscripten/blob/master/src /…

3. Вы проверили? Что заставляет вас думать, что я их не проверял? Я сделал, и они не содержат никакой информации.

4. Тот Github, который есть, содержит их. Изначально я использовал документы их веб-сайта. Теперь все ясно. Если вы можете написать ответ, я приму его.

5. @ivan_onys> прямо из документации add_compile_options

Ответ №2:

Параметры, которые вы можете передать компилятору или компоновщику, зависят от того, какой компилятор или компоновщик вы используете. Например, если вы разветвляете GCC и добавляете -Wstackoverflow-copy-pasta опцию, вы можете передать эту опцию add_compile_options() , но другие люди, использующие стандартный GCC, не могут.

Итак, ответ на ваш вопрос, похоже, заключается в том, чтобы прочитать документацию вашего компилятора и компоновщика.

Комментарии:

1. Я использую Emscripten, и я полагаю, что он использует Clang.

2. Я прочитал документацию, и в ней отсутствует эта информация, поэтому я разместил этот вопрос на первом месте.

3. Можете ли вы отредактировать свой вопрос, чтобы включить конкретные флаги из ваших старых файлов .bat, которые вы не знаете, как интегрировать в CMake? Возможно, также попробуйте make VERBOSE=1 с вашим проектом CMake посмотреть, какие параметры он передает, и сравнить их с вашими старыми файлами .bat.

4. Я уже все интегрировал, но просто чувствую себя некомфортно с игрой в угадайку. Я буду редактировать и включать флаги.

5. Я только что добавил их в post.