gpt4 book ai didi

cmake - 从 `pkg-config` 使用 `cmake` 的正确方法是什么?

转载 作者:行者123 更新时间:2023-12-03 05:37:39 25 4
gpt4 key购买 nike

在网上我看到了很多这样的代码:

include(FindPkgConfig)
pkg_search_module(SDL2 REQUIRED sdl2)

target_include_directories(app SYSTEM PUBLIC ${SDL2_INCLUDE_DIRS})
target_link_libraries(app ${SDL2_LIBRARIES})

但是,这似乎是错误的方法,因为它只使用包含目录和库,但忽略了定义、库路径和 pkg-config 可能返回的其他标志。

执行此操作并确保 pkg-config 返回的所有编译和链接标志都由已编译的 app 使用的正确方法是什么?是否有一个命令可以完成此操作,即类似 target_use(app SDL2) 的命令?

引用:

最佳答案

首先,调用:

include(FindPkgConfig)

应替换为:

find_package(PkgConfig)

find_package() 调用更加灵活,并允许诸如 REQUIRED 之类的选项,可以自动执行必须使用 include() 手动执行的操作.

其次,应尽可能避免手动调用pkg-config。 CMake 附带了一组丰富的包定义,可在 Linux 中的 /usr/share/cmake-3.0/Modules/Find*cmake 下找到。与原始调用 pkg_search_module() 相比,这些为用户提供了更多选项和选择。

至于前面提到的假设的 target_use() 命令,CMake 已经以 PUBLIC|PRIVATE|INTERFACE 的方式内置了该命令。像 target_include_directories(mytarget PUBLIC ...) 这样的调用将导致包含目录在使用 mytarget 的每个目标中自动使用,例如target_link_libraries(myapp mytarget)。但是,此机制似乎仅适用于在 CMakeLists.txt 文件中创建的库,不适用于使用 pkg_search_module() 获取的库。调用 add_library(bar SHARED IMPORTED) 可能用于此目的,但我尚未对此进行研究。

至于主要问题,这在大多数情况下都适用:

find_package(PkgConfig REQUIRED)
pkg_check_modules(SDL2 REQUIRED sdl2)
...
target_link_libraries(testapp ${SDL2_LIBRARIES})
target_include_directories(testapp PUBLIC ${SDL2_INCLUDE_DIRS})
target_compile_options(testapp PUBLIC ${SDL2_CFLAGS_OTHER})

SDL2_CFLAGS_OTHER 包含成功编译所需的定义和其他标志。然而,标志 SDL2_LIBRARY_DIRSSDL2_LDFLAGS_OTHER 仍然被忽略,不知道这会成为一个问题的频率。

更多文档请点击 http://www.cmake.org/cmake/help/latest/module/FindPkgConfig.html

关于cmake - 从 `pkg-config` 使用 `cmake` 的正确方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29191855/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com