#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-cmake2. У меня тоже есть варианты 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.