【问题标题】:How to add "-l" (ell) compiler flag in CMake如何在 CMake 中添加“-l”(ell)编译器标志
【发布时间】:2019-02-02 03:35:01
【问题描述】:

在 Ubuntu 16 上工作

我使用g++ main.cpp -lpq 命令编译我的小项目。现在我使用 Clion 并想做与 g++ 相同的操作。但是我无法在 cmake 文件中添加编译器标志并得到编译错误。

cmake_minimum_required(VERSION 3.5.1)
project(day_g)

set(CMAKE_CXX_FLAGS "-lpq")

add_definitions(-lpq)

message("CMAKE_CXX_FLAGS is ${CMAKE_CXX_FLAGS}")

set(CMAKE_CXX_STANDARD 11)

set(SOURCE_FILES main.cpp)
add_executable(day_g ${SOURCE_FILES})

另外我只运行 cmake 文件并获得带有 -lpq 标志的 CMAKE_CXX_FLAGS

CMAKE_CXX_FLAGS is -lpq
-- Configuring done
-- Generating done

如何正确地将编译器标志添加到 cmake 文件中?

【问题讨论】:

  • 标志-l 用于链接器,而不用于编译器。此标志用于与库的链接。为此,CMake 有特殊的命令 target_link_libraries
  • 谢谢!添加target_link_libraries(day_g pq) 一切正常!你能发布你的答案,所以我可以标记为 asnwer。
  • 你不是第一个询问给定问题的人,但我同意其他问题不容易搜索。试图使给定的问题规范

标签: c++ cmake clion


【解决方案1】:

标志-l 用于链接器,而不用于编译器。此标志用于与库的链接。为此,CMake 有特殊命令 target_link_libraries

target_link_libraries(day_g pq)

【讨论】:

  • 这对我也很有效,使用 GSL 库。为了工作,您必须取消前面示例中的 set(CMAKE_CXX_FLAGS "-lpq")add_definitions(-lpq)
  • @DuccioPiovani:问题描述了正确的链接方式。这意味着不需要其他链接尝试(通过 CMAKE_CXX_FLAGSadd_definitions)。
  • 我现在面临同样的问题,但是在尝试使用 pybind11 和 CMakelists.txt 构建 python 包时。在这种情况下,add_executable 命令不存在,因此我不能使用target_link_libraries(),因为也没有可执行文件来链接它。在这种情况下有什么建议吗?
  • @DuccioPiovani:我不是 pybind11 使用方面的专家。您说,不存在 add_executable 命令,但它可能是其他特定于 pybind11 的命令,它创建可执行文件。最有可能的是,此命令会创建一个可执行的 target,您可以像往常一样将其与库链接。我建议您准备新问题:您可以在那里提供更多详细信息(例如您的CMakeLists.txt 代码)。如果您发现当前问题/答案对您的新问题有用,您可以在问题中包含适当的链接。
  • 谢谢,我会马上做的。
【解决方案2】:

-lq 不是编译器标志 (CFLAGS),而是链接器标志。

要在 CMake 项目中传递库,您应该使用:

target_link_libraries(target_name libraries...)

请注意,如果您将“q”指定为库,则项目将与 libq.a 链接,或者,如果您在 windows q.dll 上。

...在您的 CMakeLists.txt 中要添加的正确行是:

target_link_libraries(day_g pq)

另请注意,当您添加 CFLAG 时,您还应该“记住”之前可能由库或您的平台添加的 CFLAG,即:

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -O3")

要检查 cmake 传递给编译器或链接器的确切标志,您可以随时从构建目录运行以下命令:

make VERBOSE=1

【讨论】:

    猜你喜欢
    • 2010-12-13
    • 1970-01-01
    • 2019-03-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多