如何在 CMakeLists.txt 中设置 LDFLAGS?

Posted

技术标签:

【中文标题】如何在 CMakeLists.txt 中设置 LDFLAGS?【英文标题】:How to set the LDFLAGS in CMakeLists.txt? 【发布时间】:2011-08-29 23:06:59 【问题描述】:

我在 CMake 中通过 CMAKE_C_FLAGS 设置了 CFLAGS。 像这样设置 LDFLAGS 吗?

【问题讨论】:

【参考方案1】:

这取决于你想要什么:

A) 如果要指定链接到哪些库,可以使用find_library 查找库,然后使用link_directories 和target_link_libraries 到。

当然,编写一个好的find_package 脚本通常是值得的,它很好地添加了带有正确位置的add_library( YourLib IMPORTED ) 的“导入”库,以及平台/构建特定的前缀和后缀。然后,您可以简单地引用“YourLib”并使用 target_link_libraries。

B) 如果您希望指定特定的链接器标志,例如'-mthreads' 或 '-Wl,--export-all-symbols' 与 MinGW-GCC,你可以使用 CMAKE_EXE_LINKER_FLAGS。对于模块、共享库或静态库,还有两个类似但未记录的标志:

CMAKE_MODULE_LINKER_FLAGS
CMAKE_SHARED_LINKER_FLAGS
CMAKE_STATIC_LINKER_FLAGS

【讨论】:

和 CMAKE_STATIC_LINKER_FLAGS 用于静态库:cmake.org/cmake/help/v3.0/variable/… 只是一个指向最近 CMake3.0 描述的链接:CMAKE_EXE_LINKER_FLAGS。请注意, MODULE/SHARED/STATIC 标志已经记录在案(虽然很模糊)。 模块标志是干什么用的? @CMCDragonkai 我认为它用于 macOS 中的 clang 模块库。 你如何使用定义? CMAKE_MODULE_LINKER_FLAGS += "-Mprogram.mapfile" 失败。【参考方案2】:

看看:

CMAKE_EXE_LINKER_FLAGS
CMAKE_MODULE_LINKER_FLAGS
CMAKE_SHARED_LINKER_FLAGS
CMAKE_STATIC_LINKER_FLAGS

【讨论】:

【参考方案3】:

如果您想为每个链接添加一个标志,例如-fsanitize=address 那么我不推荐使用CMAKE_*_LINKER_FLAGS。即使它们都设置了,在 OSX 上链接框架时它仍然不使用标志,也许在其他情况下。而是使用link_libraries():

add_compile_options("-fsanitize=address")
link_libraries("-fsanitize=address")

这适用于一切。

【讨论】:

如果我只想设置链接器标志,是否需要 add_compile_options? 这是目前最好、最干净的方法。【参考方案4】:

您可以在target_link_libraries 中指定链接器标志。

【讨论】:

【参考方案5】:

有关与库的链接,请参阅Andre's answer。

对于链接器标志 - 以下 4 个 CMake 变量:

CMAKE_EXE_LINKER_FLAGS
CMAKE_MODULE_LINKER_FLAGS
CMAKE_SHARED_LINKER_FLAGS
CMAKE_STATIC_LINKER_FLAGS

可以使用ucm 的ucm_add_linker_flags 宏轻松操作不同的配置(调试、发布...)

【讨论】:

以上是关于如何在 CMakeLists.txt 中设置 LDFLAGS?的主要内容,如果未能解决你的问题,请参考以下文章

没有使用ROS顶层CMakelists.txt,如何给所有子项目的cmake默认值?

cmake基础教程(43)关于变量设置的scope问题

cmake基础教程(43)关于变量设置的scope问题

CMAKE_CXX_COMPILER 未在 qtcreator 中设置

为子项目应用 CMake 设置

在python脚本中设置环境变量