Я годами использую файл .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
или флагов компоновщика.
Я привык компилировать все в одну строку, а теперь в CMake все выглядит как отдельные шаги.
У меня тоже есть варианты target_*, и, поскольку у меня есть несколько целей, у меня есть общие флаги, которые должны быть разделены между ними. Но в любом случае, цель это или нет, я до сих пор понятия не имею, что делать с флагами.
Когда вы запускаете make clean && make VERBOSE=1
, компиляция и компоновка отображаются как два отдельных шага? Отображает ли он --bind
в команде компоновщика и WASM=1
в команде компилятора? Команды, запускаемые с помощью -c
, являются компиляцией, а не компоновкой. Мне кажется, что, возможно, все 3 параметра, которые вы передаете, относятся к фазе компиляции, но я могу ошибаться. Было бы полезно, если бы вы сообщили нам, идет ли сейчас ваш проект нормально, или есть проблема, в чем она заключается.
Параметры, которые вы можете передать компилятору или компоновщику, зависят от того, какой компилятор или компоновщик вы используете. Например, если вы разветвляете GCC и добавляете параметр -Wstackoverflow-copy-pasta
, вы можете передать этот параметр add_compile_options()
, но другие люди, использующие стандартный GCC, не могут.
Таким образом, ответ на ваш вопрос, похоже, прочитайте документацию вашего компилятора и компоновщика.
Я использую Emscripten, и я думаю, что он использует Clang.
Я прочитал документацию, и в ней отсутствует эта информация, поэтому я разместил этот вопрос на первом месте.
Можете ли вы отредактировать свой вопрос, включив в него определенные флаги из ваших старых файлов .bat, которые вы не знаете, как интегрировать в CMake? Возможно, также попробуйте make VERBOSE=1
с вашим проектом CMake, чтобы увидеть, какие параметры он куда передает, и сравните их со своими старыми файлами .bat.
Я уже все интегрировал, но мне просто неудобно играть в угадайку. Я отредактирую и включу флаги.
Я просто добавил их в пост.
@jeffbRTC: Насколько я понимаю из документации, Emscripten использует emcc
как компилятор и как компоновщик. Согласно этому ответу, -s
— это вариант компоновщика.
@Tsyvarev emcc использует Clang, а -s - это не просто параметр компоновщика, потому что -s WASM=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.
в то время как -s STRICT=1 ведет себя так, что другие флаги нельзя использовать таким образом. Мне просто нужно знать, какие флаги я должен передать на этапах компиляции и компоновщика.
Просто найдите их в документации. Документация по Clang находится здесь: clang.llvm.org/docs/ClangCommandLineReference.html и документация по флагам emscripten находится здесь: github.com/emscripten-core/emscripten/blob/master/src/…
Вы проверили? С чего ты взял, что я их не проверял? Я сделал, и они не содержат никакой информации.
Github содержит их. Сначала я использовал документы их веб-сайта. Теперь все ясно. Если вы можете написать ответ, я приму его.
В целом документация emscripten хороша, но некоторые технические детали найти труднее, чем следовало бы. Ссылка на эту страницу находится в справочнике EMCC, примерно на 2 страницы вниз, в документации для -s OPTION[=VALUE]
.
Когда следует использовать строку в кавычках, а когда можно указать параметры дословно? Откуда взялся синтаксис «SHELL:»?
@ivan_onys> прямо из документации add_compile_options
Ничего. Вы должны использовать не их, а варианты
target_*
. Но в целом, прочитайте хорошее руководство, такое как cliutils.gitlab.io/modern-cmake