小编Joe*_*ann的帖子

在 CloudFormation 中更新用户数据时强制更换 EC2 实例

我正在使用模板中的UserData字段在CloudFormation实例上安装软件。当我更新时,UserData我想CloudFormation替换实例。但是,UserData不是替换字段,因此实例停止但未替换,新UserData脚本永远不会运行。

有没有一种方法,我可以更新UserDataCloudFormation

我指的是这个文档

templates amazon-ec2 amazon-web-services aws-cloudformation

13
推荐指数
1
解决办法
727
查看次数

将 --whole-archive 链接器选项与 CMake 和具有其他库依赖项的库一起使用

我有一个项目,它曾经是一组巨大的源文件,所有这些源文件都经过编译然后链接为一个可执行文件。作为使项目更加模块化的第一步,我将构建分解为几个更小的块,并使它们成为静态库。有一个层次结构,因此Exe1将链接到静态库Lib2ALib2B. Lib2A将取决于 static Lib3Alib3Blib3C等。此处的数字显示了它们在层次结构中的层。

问题是我需要--whole-archive在链接时使用,否则找不到底层库中的某些符号。

当我添加以下链接时Exe1

target_link_libraries(Exe1 -Wl,--whole-archive Lib2A Lib2B -Wl,--no-whole-archive)
Run Code Online (Sandbox Code Playgroud)

我最终得到了一个实际的链接阶段命令,例如:

g++ -o Exe1 -Wl,--whole-archive libLib2A.a libLib2B.a -Wl,--no-whole-archive libLib3A.a libLib3B.a libLib3C.a
Run Code Online (Sandbox Code Playgroud)

不可避免地,某些第 3 层静态库中的符号会丢失,并且会出现丢失符号错误。

我期望因为Lib2ALib3*库作为依赖项,所以它们也会--whole-archive在链接器命令的“内部”部分,但它们出现在外部。

我尝试了许多不同的组合(例如将--whole-archive东西放在较低层),但还没有遇到使用 CMake 的方法。我究竟做错了什么?

谢谢

c++ g++ cmake

12
推荐指数
2
解决办法
9206
查看次数

如何配置 CMakeLists.txt 以安装共享库的公共头文件?

我想使用 cmake 来安装我的库,edv但是当我执行时:

cmake --build . --target install
Run Code Online (Sandbox Code Playgroud)

它会安装,但只会创建bin/edv.dlllib/ < empty >。我怎样才能让 cmake 安装在EDV_PUBLIC_INCLUDE_DIRECTORIES里面include/...

这是我的CMakeLists.txt

cmake_minimum_required(VERSION 3.12)

project(edv)

# include PUBLIC directories
set(EDV_PUBLIC_INCLUDE_DIRECTORIES      include/ )

set(EDV_PRIVATE_INCLUDE_DIRECTORIES     src/   )

# Edv source files list
file(GLOB_RECURSE EDV_SOURCE_FILES "src/*.cpp" "src/*.hpp*")


# build the library
add_library(${PROJECT_NAME} SHARED ${EDV_SOURCE_FILES} )

target_include_directories(${PROJECT_NAME} PUBLIC ${EDV_PUBLIC_INCLUDE_DIRECTORIES})
target_include_directories(${PROJECT_NAME} PRIVATE ${EDV_PRIVATE_INCLUDE_DIRECTORIES})

install (TARGETS ${PROJECT_NAME}
    RUNTIME DESTINATION bin
    LIBRARY DESTINATION lib
    ARCHIVE DESTINATION lib
    PUBLIC_HEADER DESTINATION include
)
Run Code Online (Sandbox Code Playgroud)

c++ cmake

11
推荐指数
2
解决办法
9202
查看次数

C ++ STL容器要求-后置条件混乱

我目前正在考虑实现一个自定义容器,该容器需要与STL算法兼容,因此必须满足此处所述的C ++容器要求。

Methods and operators表在该文档中指出,表达式a = b的后置条件为a == b。我对此深感困惑。如该表达式的表项所示:

销毁或移动-分配a来自的元素b

据我了解,移动对象时伴随着这样的期望,即被移动的对象(源对象?)将处于有效但未定义的状态。因此,a == b我认为不能满足该条件。

我在这里想念什么?

c++ containers

6
推荐指数
1
解决办法
87
查看次数

CMake target_sources 并安装

我很难弄清楚如何PUBLIC安装target_sources().

除了将私有源添加到可执行文件之外,这似乎target_sources()有点神秘。在阅读了大量材料之后,尤其是这篇博客文章很有帮助,我设法理解并绕过了target_sources()PUBLIC 文件的问题。CMakeLists.txt我的 C++ 库项目的许多子目录之一中的A如下所示:

target_sources(mylib
    PRIVATE
        foo.cpp

    PUBLIC
        $<BUILD_INTERFACE:${CMAKE_CURRENT_LIST_DIR}/foo.hpp>
        $<INSTALL_INTERFACE:foo.hpp>
)
Run Code Online (Sandbox Code Playgroud)

这使我能够成功构建该库。但是,在安装时,永远不会安装PUBLIC部分中列出的头文件。target_sources()

我的安装如下所示:

install(
    TARGETS
        mylib
    EXPORT mylib-targets
    LIBRARY
        DESTINATION ${CMAKE_INSTALL_LIBDIR}
        COMPONENT lib
    ARCHIVE
        DESTINATION ${CMAKE_INSTALL_LIBDIR}
        COMPONENT lib
    RUNTIME
        DESTINATION ${CMAKE_INSTALL_BINDIR}
        COMPONENT bin
    INCLUDES
        DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/mylib
Run Code Online (Sandbox Code Playgroud)

但是,这不会安装任何标头。这个stackoverflow 答案提到了使用,PUBLIC_HEADER但阅读文档并没有让我觉得这与我的情况相关。

问题:PUBLIC安装或INTERFACE使用标头的正确方法是什么install()

背景:CMakeLists.txt我的目标是在源代码树的每个子目录中都有一个单独的子目录。这些列表中的每一个都应该用于target_sources()将文件添加PRIVATEPUBLIC构建中。应在安装过程中安装所有PUBLIC(和)源。INTERFACE

cmake

6
推荐指数
1
解决办法
4283
查看次数

从 C 字符串数组创建 string_views 的范围

给定某个函数void func(std::span<std::string_view>),如何const char**以最有效的方式为该函数提供原始 C 字符串数组?

据我了解,这应该是可能的,因为std::string_view可以从 C 字符串std::span构造并且可以从指针 + 大小构造,而无需任何复制。但是,我似乎无法弄清楚正确的语法。

下面是一些std::vector<std::string_view>通过迭代字符串数组中的每个字符串来创建一个的最小代码:

#include <iostream>
#include <string>
#include <span>
#include <vector>

static void func(std::span<std::string_view> strings)
{
    // Just print the strings...
    std::cout << "strings:\n";
    for (const auto& str : strings)
        std::cout << str << "\n";
    std::cout << std::endl;
}

int main()
{
    // Raw C string array
    const char* raw_strings[3] = {
        "This is a string",
        "This is also a string",
        "And …
Run Code Online (Sandbox Code Playgroud)

c++ string-view c++20 std-span

6
推荐指数
1
解决办法
463
查看次数

为什么 const int 需要 extern 而 const char* 不需要

我对为什么在我的 extern.cpp 文件的定义中需要extern或不需要intvs感到困惑char*。我有以下测试程序:

// extern.cpp
extern const int my_int = 1;
const char* my_str = "FOO";
Run Code Online (Sandbox Code Playgroud)
// main.cpp
#include <iostream>

extern const int my_int;
extern const char* my_str;

int main() {
  std::cout << my_int;
  std::cout << my_str;
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

如果我删除externfromextern const int my_int = 1;那么我得到undefined reference to 'my_int'. 如果我将 extern 添加到const char* my_str = "FOO";然后我会收到警告'my_str' initialized and declared 'extern'。我为什么需要externmy_int,但将它添加到 …

c++ extern c++17

6
推荐指数
1
解决办法
148
查看次数

"无用的类型限定符"错误

我使用以下代码得到以下错误.我试图找出问题在谷歌的哪个方面,但我找不到任何有用的东西.

Compiling /home/tectu/projects/resources/chibios/ext/lcd/touchpad.c
In file included from /home/tectu/projects/resources/chibios/ext/lcd/touchpad.c:1:0:
/home/tectu/projects/resources/chibios/ext/lcd/touchpad.h:17:1: warning: useless type qualifier in empty declaration [enabled by default]
Run Code Online (Sandbox Code Playgroud)

这是第12行到第17行的代码touchpad.h:

volatile struct cal {
    float xm; 
    float ym; 
    float xn; 
    float yn; 
};
Run Code Online (Sandbox Code Playgroud)

以下是我在内部使用此结构的方法touchpad.c:

static struct cal cal = { 
    1, 1, 0, 0  
};
Run Code Online (Sandbox Code Playgroud)

有谁能告诉我光明?:d

c struct

5
推荐指数
4
解决办法
1721
查看次数

如何在 OpenCV 中打印矢量值

我是 OpenCV 的新手。请告诉我如何使用std::cout.

std::vector<std::vector<cv::Point>> contours;  
std::vector<cv::Vec4i> hierarchy;
Run Code Online (Sandbox Code Playgroud)

c++ opencv

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

推导 C++ 中的模板返回类型

目前,我尝试编写一个函数retrieveKeys(),该函数为我提供 a 的键std::map并将其存储在某些std::container. 该函数应以两种方式通用:

  • 接受std::mapstd::unordered_map作为参数类型。
  • 返回用户定义的容器中的键,例如std::vectoror std::deque(容器必须支持push_back()方法)。

目前该函数的使用原理如下:

std::unordered_map<int, int> testMap;
std::map<int, int> testMap2;

std::vector<int> keys1 = retrieveKeys<std::vector>(testMap);    
std::deque<int> keys2 = retrieveKeys<std::deque>(testMap);
std::vector<int> keys3 = retrieveKeys<std::vector>(testMap2);
std::deque<int> keys4 = retrieveKeys<std::deque>(testMap2);
Run Code Online (Sandbox Code Playgroud)

具有以下功能:

template<template<typename...> typename KeyContainer, typename... KeyContainer_Rest,
         template<typename...> typename MapContainer, typename K, typename V, typename... MapContainer_Rest>
inline KeyContainer<K, KeyContainer_Rest...> retrieveKeys(const MapContainer<K, V, MapContainer_Rest...>& map)
{
    KeyContainer<K, KeyContainer_Rest...> keys;

    for (const auto& m : map)
    {
        keys.push_back(m.first); …
Run Code Online (Sandbox Code Playgroud)

c++ templates return-type-deduction

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