【问题标题】:Difference between add_compile_options and add_link_options also flags each option supportsadd_compile_options 和 add_link_options 之间的区别也标记了每个选项支持
【发布时间】:2021-03-24 01:44:57
【问题描述】:

多年来,我一直在使用.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_* 变体。但更一般地说,阅读一个好的指南,如cliutils.gitlab.io/modern-cmake
  • 我也有 target_* 变体,因为我有多个目标,所以我有必须在它们之间共享的公共标志。但无论哪种方式,无论是目标还是非目标,我仍然不知道如何处理标志。
  • 当您运行make clean && make VERBOSE=1 时,它是否将编译和链接显示为两个单独的步骤?它是否在链接器命令中显示--bind 而在编译器命令中显示WASM=1?使用-c 运行的命令是编译,而不是链接。在我看来,您传递的所有 3 个选项可能都属于编译器阶段,但我可能是错的。如果您告诉我们您的项目现在是否可以正常构建,或者如果有问题,会有所帮助。

标签: c++ cmake compilation linker linker-flags


【解决方案1】:

我不确定您的问题是什么,但这里有一个来自 Wasm 项目的完整工作示例,它设置了项目范围的严格模式并禁用了异常支持:

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

特别注意,由于它在emscripten settings 中有一个[compile+link] 标记,-s STRICT=1 必须用于编译和链接,因此它出现在每个标记中。

if(EMSCRIPTEN) 之所以存在,是因为这个项目也可以为 Windows 和 Linux 构建。

【讨论】:

【解决方案2】:

您可以传递给编译器或链接器的选项取决于您使用的编译器或链接器。例如,如果你 fork GCC 并添加一个 -Wstackoverflow-copy-pasta 选项,你可以将该选项传递给 add_compile_options(),但其他使用标准 GCC 的人不能。

所以你的问题的答案似乎是,阅读你的编译器和链接器文档。

【讨论】:

  • 我正在使用 Emscripten,我相信它使用 Clang。
  • 我已阅读文档,但缺少此信息,这就是我首先发布此问题的原因。
  • 您能否编辑您的问题以包含您不确定如何集成到 CMake 中的旧 .bat 文件中的特定标志?也许还可以在您的 CMake 项目中尝试 make VERBOSE=1 以查看它在哪里传递了哪些选项,并将这些选项与您的旧 .bat 文件进行比较。
  • 我已经整合了所有东西,但对猜谜游戏感到不舒服。我将编辑并包含标志。
  • 我刚刚将它们添加到帖子中。
猜你喜欢
  • 2017-01-22
  • 2015-04-01
  • 2011-06-10
  • 1970-01-01
  • 2021-12-31
  • 1970-01-01
  • 2016-11-09
  • 1970-01-01
  • 2012-03-24
相关资源
最近更新 更多