小编Tho*_*ire的帖子

C++中的折叠表达式17 - 用于比较运算符的用例

根据N4295, C++ 17将允许我计算未知数量的参数的总和,从而:

template<typename ... T>
int sum(T...t)
{
    return (... + t);
}
Run Code Online (Sandbox Code Playgroud)

该文档进一步指出我可以使用诸如==或>之类的运算符而不是+.任何人都能想出一个合理的例子,当我想在这样的结构中使用==或>时?

(我意识到人们可以定义==和>为奇怪的课程做一些奇怪的事情,但肯定会违反良好的做法.写作a > b > c > d几乎不是一个好主意,是吗?)

c++ fold-expression c++17

14
推荐指数
1
解决办法
1788
查看次数

使用折叠表达式打印所有可变参数,并在其间使用换行符

C++ 17折叠表达式的经典示例是打印所有参数:

template<typename ... Args>
void print(Args ... args)
{
    (cout << ... << args);
}
Run Code Online (Sandbox Code Playgroud)

例:

print("Hello", 12, 234.3, complex<float>{12.3f, 32.8f});
Run Code Online (Sandbox Code Playgroud)

输出:

Hello12234.3(12.3,32.8)
Run Code Online (Sandbox Code Playgroud)

我想在输出中添加换行符.但是,我找不到一个好方法,到目前为止我找到的最好的方法:

template<typename ... Args>
void print(Args ... args)
{
    (cout << ... << ((std::ostringstream{} << args << "\n").str()));
}
Run Code Online (Sandbox Code Playgroud)

然而,这不是零开销,因为它ostringstream为每个参数构造临时值.

以下版本也不起作用:

(cout << ... << " " << args);

error: expression not permitted as operand of fold expression
Run Code Online (Sandbox Code Playgroud)

(cout << ... << (" " << args));

error: invalid operands to binary expression 
Run Code Online (Sandbox Code Playgroud)

我理解为什么最后两个版本不起作用.使用折叠表达式是否有更优雅的解决方案?

c++ variadic-templates fold-expression c++17

10
推荐指数
2
解决办法
1642
查看次数

将现有rootfs与自定义工具链相结合

我已经安装了一个带有Emdebian的Raspberry PI,并希望交叉编译项目.

有很多关于如何获得工具链并使用它构建一个简单项目的文档.我自己设法用crosstool-ng构建了一个工具链,并编写了一个工作正常的hello world程序.

我没有得到的是如何处理交叉编译更复杂的项目,如Qt,它们依赖于其他库.我们以libdbus为例,因为这是Qt的依赖项之一.

已安装的Emdebian已经包含了libdbus.so,所以我更愿意使用它,而不是交叉编译我自己的libdbus.so,因为编译Qt的所有依赖都需要花费很多时间.

对于交叉编译,据我所知,有两个重要的目录:

  1. "临时"目录下,所有已安装的库和应用程序生活.这最初是工具链的sysroot目录的副本,并且在交叉编译时会填充更多库.
  2. "根文件系统"目录,这相当于什么设备上-本质上是不一样的文档和头文件不需要的东西临时目录中的副本.据我了解,最好的方法是将所需的文件从登台目录复制到rootfs中.

获取rootfs目录很简单,因为它可以是来自设备的NFS挂载.但是,如何在PI上获取现有Emdebian安装的暂存目录?登台目录需要包含诸如dbus标头之类的东西,这些标头未安装在rootfs上.

有些人只需使用apt-get install libdbus-dev在设备上安装dbus头,然后使用rootfs作为暂存目录.使用此设置,rootfs和staging之间没有区别,缺点是rootfs受到头文件,文档等的污染.当然,优势在于它很容易.

将dbus标头放入主机上的暂存目录的最佳方法是什么?人们在这种情况下使用的常用方法是什么?

作为一个附带问题,为什么获得工具链,编译程序然后将其复制到目标上的方法根本就起作用?工具链附带了自己的libc,libstdc ++等版本,它们是否与目标上安装的版本不兼容?特别是在使用使用crosstool-ng编译的自定义工具链创建时?

(请注意,我不是在问如何编译Qt,我可以自己解决这个问题.我的问题更为笼统,关于将自定义工具链与现有安装/ rootfs结合使用时的方法)

linux cross-compiling raspberry-pi crosstool-ng

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

预链接仅对相对重定位有影响

我正在使用交叉预链接来预链接使用 Qt 用于嵌入式 ARM 设备的大型 C++ 可执行文件。请注意,我没有使用 Yocto,而是使用自定义发行版 - 因此我目前正在手动运行预链接。

查看 prelink 的输出,它似乎有效:

$ prelink --verbose --ld-library-path=/opt/<product>/lib:/usr/local/Qt-5.3.1/lib --root=$PRODUCT_TARGET_ROOT/<product>/rfs/ /path/to/binary
Laying out 56 libraries in virtual address space 41000000-50000000
Assigned virtual address space slots for libraries:
/lib/ld-linux.so.3                                           41000000-41027908
/opt/<product>/lib/lib<product>common.so.1                   41030000-41cf0fd0
/lib/libc.so.6                                               442b0000-443e3980
/usr/local/Qt-5.3.1/lib/libQt5Qml.so.5                       434f0000-4380ee84
[..]
Prelinking /lib/ld-2.17.so
Prelinking /lib/libc-2.17.so
Prelinking /path/to/binary
Prelinking /<product>/lib/lib<product>common.so.1.0.0
Prelinking /usr/local/Qt-5.3.1/lib/libQt5Qml.so.5.3.1 
[..]
Run Code Online (Sandbox Code Playgroud)

当库被加载时,至少 libQt5Qml.so 和 libproductcommon.so 似乎被加载到预链接设置的首选加载地址:

$ cat /proc/`pidof binary`/maps
2ab49000-2ab4a000 r--p 0001e000 07:00 9357       /roroot/lib/ld-2.17.so
2ab4a000-2ab4b000 rw-p 0001f000 07:00 9357       /roroot/lib/ld-2.17.so …
Run Code Online (Sandbox Code Playgroud)

linux linker elf ld prelink

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