小编joh*_*003的帖子

cmake install“noconfig”脚本有什么用?IE。“XXXTarget-noconfig.cmake”

我正在尝试编写必要的脚本,find_package以便为一些没有 cmake 构建或至少没有导出其目标但在安装路径中的库导入目标:CMAKE_PREFIX_PATH. 例如,对于一些导出目标的库 Foo,有生成的文件:

lib/cmake/Foo/FooTargets.cmake
lib/cmake/Foo/FooTargets-noconfig.cmake
Run Code Online (Sandbox Code Playgroud)

...以及项目提供的:

lib/cmake/Foo/FooConfig.cmake   (and maybe FooConfigVersion.cmake)
Run Code Online (Sandbox Code Playgroud)

...找到依赖项,然后包含生成的 FooTargets.cmake。

似乎生成的 FooTargets.cmake 通常只包含 noconfig 版本,通过通配符:

# Load information for each installed configuration.
get_filename_component(_DIR "${CMAKE_CURRENT_LIST_FILE}" PATH)
file(GLOB CONFIG_FILES "${_DIR}/FooTargets-*.cmake")
foreach(f ${CONFIG_FILES})
  include(${f})
endforeach()
Run Code Online (Sandbox Code Playgroud)

但是这些配置是指什么?什么是“无配置”?

我猜配置是指调试或发布,当这些在 CMakeLists.txt 脚本中没有区分时,它只是默认生成“noconfig”?

c++ cmake

7
推荐指数
1
解决办法
930
查看次数

如何使用配置模式进行 find_package 搜索并在模块模式下进行回退?

当一个库使用 CMake 定义构建并经历为自己构建安装包的麻烦时,将会有一个XXXConfig.cmake.

如果库无法将其目标导出到 CMake,CMake 会尝试通过提供FindXXX.cmake尝试定位此类库的脚本来弥补这一差距。

在文档中,FindXXX.cmake(模块模式)首先尝试,只有当失败时才尝试使用XXXConfig.cmake(配置模式)。但这对我来说似乎真的很倒退。

问题是,例如,我从源代码构建了 CURL,而 ConfigXXX 生成的目标名称与 FindXXX 不同,因此,在尝试使用它时,它失败了,因为 FindXXX 负责 find_package 请求并加载了与 FindXXX 不同的目标名称我所期待的。

我至少可以告诉 CMake 以相反的方式做事吗?首先是配置模式。

我知道我可以完全禁用模块模式,但我宁愿将其作为后备选项。

c++ cmake

7
推荐指数
2
解决办法
1096
查看次数

应如何使用现代 CMake 添加 SSE 标志?

我尝试至少遵循现代 cmake >= 3.0 的准则,其中我不假设有关编译器的任何内容并使用基于目标的命令。

请参阅:https ://www.youtube.com/watch? v=bsXLMQ6WgIk 或搜索“ effective cmake”。

那么,当我的目标依赖于 SSE 4.1 时,我应该如何声明这些信息呢?

我实际上期望 FindSSE 包含一个没有源的接口目标,但带有它自己的适当的链接器标志。但它仅说明主机上是否存在 SSE 版本。

这因平台而异,例如:/arch:sse4.1 vs -msse4.1

那么我是否缺少 cmake 内部处理不同编译器的此设置的内容,或者我只需要检查平台并相应地设置 target_compile_options ?

c++ cmake

5
推荐指数
1
解决办法
6322
查看次数

可重定位的多平台安装的理想cmake安装目录结构是什么?

CMake安装使用目标目录,通常使用GNUInstallDirs加载目标名称的标准值。例如:

include(GNUInstallDirs)
install(TARGETS Foo
    EXPORT Foo
    INCLUDES DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}
    RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
    ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
    LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
)
Run Code Online (Sandbox Code Playgroud)

但是,它没有提供为不同平台或体系结构构建的不同路径。我一直在通过以下方式安装到项目中特定于平台的文件夹中CMAKE_INSTALL_PREFIX

CMAKE_INSTALL_PREFIX=dist/${CMAKE_SYSTEM_NAME}/${CMAKE_SYSTEM_PROCESSOR}
Run Code Online (Sandbox Code Playgroud)

但是,这有一些问题:

  • 它复制了跨平台相同的include。
  • 如果我将不同平台安装到同一根目录但更改了lib目录,则cmake在lib / non / standard / path / cmake / FooConfig.cmake中找不到cmake配置目标。
  • 而且,模块模式搜索也无法正确找到库,这在完成MODULE模式搜索时会出现问题。如果该库恰好也有一个cmake模块,该模块要求每个find_package必须指定“ CONFIG”,该配置开始变得怪异,则可能会发生这种情况,特别是当第3方库被告知要考虑此安装目录的常见依赖性时,并且不要t在find_package中指定CONFIG,因为为什么要这么做?

我正在寻找一种与find_package模块模式和config模式一起使用的结构;像这样的东西:

<install_prefix>/
  include/
    foo/
      foo.h
  lib/
    <PLAT x ARCH x CONFIG>/
      cmake/
        foo/
          FooConfig.cmake
      libFoo.a
Run Code Online (Sandbox Code Playgroud)

目标是:

  • 可以为不同的平台,体系结构和配置共同安装libs
  • 可以共享
  • 查找包括应该在典型的模块模式搜索中工作
  • 应该只适用于vanilla find_package(Foo REQUIRED),但适用于适当的平台和架构。

考虑到我将在这里主要安装第三方库,如果可以通过重写GNUInstallDirs中的var来完成,那么它可能适用于许多库。我猜其余的部分要么必须进行编辑,要么我就放弃并使用包含平台和架构的单独安装目录。

c++ multiplatform cmake

5
推荐指数
1
解决办法
513
查看次数

没有应用服务器,网络上的FCM是否安全?

我想从我的网站上的客户端生成消息,并将消息发送到目标设备.使用像这样的ajax(jquery)请求很简单:

$.ajax({
    url: 'https://fcm.googleapis.com/fcm/send',
    type: 'POST',
    contentType: "application/json",
    dataType: 'json',
    data: JSON.stringify({
        "notification": {
            "title": title,
            "body": msg,
            "sound": "default"
        },
        "to": "XXXXXXXXXXXX"
    }),
    beforeSend: function(xhr) {
        xhr.setRequestHeader('Authorization', 'key=YYYYYYYYYY');
    }
});
Run Code Online (Sandbox Code Playgroud)

但是,那么我不需要保持XXXXXXXXXXXX设备密钥,并且YYYYYYYYYY API密钥是私有的吗?如果没有,我担心人们会开始刮掉这些并从完全不相关的服务中发送垃圾邮件?

firebase firebase-cloud-messaging

3
推荐指数
1
解决办法
632
查看次数