我们来看一个简单的例子:
struct some_struct {
std::string str;
int a, b, c;
}
some_struct abc, abc_copy;
abc.str = "some text";
abc.a = 1;
abc.b = 2;
abc.c = 3;
abc_copy = abc;
Run Code Online (Sandbox Code Playgroud)
然后abc_copy是一个精确复制的abc..怎么可能没有定义=操作符?
(在处理一些代码时,这让我感到意外..)
如何告诉STL,特别是resize()vector中的方法,用默认的构造函数初始化对象,以及使用哪些参数?
例如:
class something {
int a;
something (int value);
}
std::vector<something> many_things;
many_things.resize (20);
Run Code Online (Sandbox Code Playgroud)
更一般地说,当需要创建对象并将参数传递给该构造函数时,如何强制STL使用我的构造函数?
在我的情况下,添加默认构造函数不是一个选项,我宁愿不使用指针数组来解决问题.
在C或C++中,可以说size_t(无符号整数数据类型)可以容纳的最大数量与向该数据类型强制转换-1相同.例如,请参阅size_t的无效值
为什么?
我的意思是,(谈论32位整数)AFAIK最重要的位保持有符号数据类型的符号(即,位0x80000000形成负数).那么,1是0x00000001 .. 0x7FFFFFFFF是int数据类型可以容纳的最大正数.
然后,AFAIK的-1 int的二进制表示应该是0x80000001(也许我错了).为什么/如何将这个二进制值转换为完全不同的任何东西(0xFFFFFFFF)时将int转换为unsigned?或..如何形成0xFFFFFFFF的二进制-1?
我毫不怀疑在C :((unsigned int)-1)== 0xFFFFFFFF或((int)0xFFFFFFFF)== -1同样真实而不是1 + 1 == 2,我只是想知道为什么.
我想做的(用于记录目的)是这样的:
编写此代码是为了显示我的问题,实际代码很复杂,是的,我有充分的理由在C++上使用宏=)
# define LIB_SOME 1
# define LIB_OTHER 2
# define WHERE "at file #a, line #l, function #f: "
// (look for syntax hightlighting error at SO xd)
# define LOG_ERROR_SIMPLE(ptr, lib, str) ptr->log ("ERROR " str \
" at library " #lib);
# define LOG_ERROR(ptr, lib, str) LOG_ERROR_SIMPLE(ptr, lib, WHERE str)
LOG_ERROR_SIMPLE (this, LIB_SOME, "doing something")
LOG_ERROR (this, LIB_OTHER, "doing something else")
Run Code Online (Sandbox Code Playgroud)
LOG_ERROR_SIMPLE() 写入lib参数的字符串化(由""包围的宏名称)
但随后LOG_ERROR写入已扩展的宏的字符串化("2").这是预期的,因为lib在扩展和调用之前得到了扩展LOG_ERROR_SIMPLE.但这不是我需要的.
基本上我的问题是:如何在调用另一个宏函数时避免宏函数参数的宏扩展?
我使用了一个避免宏扩展的技巧:
LOG_ERROR(ptr, lib, str, x) LOG_ERROR_SIMPLE(ptr, …Run Code Online (Sandbox Code Playgroud) 我有一个程序,通过从一些plugin_name.so动态加载一个函数来实现一个插件系统(像往常一样).
但反过来我有一个静态的"帮助器"库(让我们称之为helper.a),它的功能既可以从主程序中使用,也可以在插件中使用main函数.它们不必以任何方式互操作,它们只是文本操作等的辅助函数.
这个程序一旦启动就无法重新加载或重新启动,这就是为什么我期望从插件中获得新的"帮助"功能,而不是主程序.
所以我的questin是..是否有可能强制.so中的这个"插件功能代码"使用(静态链接?)一个不同的(也许是更新的)"helper"版本而不是主程序?
怎么可以这样做?也许通过静态链接或以其他方式将helper.a添加到plugin_name.so?
有没有一种简单而有效的办法知道一个给定的动态链接ELF是缺少必要的.所以它的运行,所有从内一个C/C++程序的?
我需要一个具有某些类似功能的程序ldd,而不是试图执行ELF以找出系统中的(met/unmet)依赖项.也许通过一些库询问ld-linux.so实用程序?(我是这部分linux的新手=)
注意:阅读源代码
ldd对我的意图不是很有帮助:它似乎ldd实际上是在分支另一个进程并执行程序.
如果在不执行程序的情况下无法知道程序是否存在未满足的依赖项,是否有某种方法可以至少快速地ELF从我的程序中列出所有的.so所需的内容?
在此先感谢=)
我需要为 Cortex-M MCU 构建一个完整的 linux 开发框架,特别是 STM32F7 Cortex-M7。首先,我必须解释一些背景信息,所以请耐心等待。
我已经下载并构建了一个带有 croostool-ng 1.24 的 gcc 工具链,指定了一个 armv7e-m 架构,其中包含仅拇指指令和 linux 4.20 作为操作系统,并且我希望输出是 FLAT 可执行文件(我认为这意味着 bFLT)。
然后我继续使用 编译 linux 内核(版本 4.20)configs/stm32_defconf,然后静态编译的 busybox rootfs,全部使用我的新工具链。
内核启动得很好,但给我一个错误和内核痛苦,并显示以下消息:
启动 init: /sbin/init 存在但无法执行(错误 -8)
和
request_module:无法处理 modprobe binfmt-464c,kmod 忙于 50 个线程
有趣的部分是最后一条消息。我的busybox可执行文件竟然是一个.ELF!Cortex-M没有 MMU,所以不可能在.ELF支持MMU 的架构上构建 linux 内核,这就是为什么找不到 (464c)"LF" 二进制加载器,没有。
所以最后,我的问题是:
我如何构建 bFLT 可执行文件以在无 MMU 的 Linux 架构上运行?我的工具链有 elf2flt,但在 crosstool-ng 中,我已经指定了无 MMU 架构和 FLAT 二进制文件,我期待直接 bFLT 输出,而不是“无用”的可执行文件。这甚至可能吗?
或者更好:是否有记录的标准程序来构建基于 Cortex-M 的完整、有效的 …
我有一个C++程序,它在运行时链接,比方说,mylib.so.然后,同一个程序使用dlopen()/ dlsym()从myplugin.so加载一个函数,动态库又依赖于mylib.so.
我的问题是:插件中的程序和函数是否会在为程序保留的同一内存区域中访问mydlib.so中定义的相同全局变量,或者每个都将在其自己的内存空间中分配不同的,不相关的副本?如果后者是默认行为,是否可以改变它?
在此先感谢=)!
我正在尝试将已编译的程序上传到微控制器..我的问题不在于编程或上传内容..我的问题是如何上传uu
该程序在C中,并与SDCC一起编译.mcu是ATMEL的AT89S8252.
我按照其数据表中所述的串行编程协议构建了一个简单的并行端口编程器.
到目前为止这么好..但是......我上传到mcu的什么?
在编译时,SDCC会生成大量的文本报告..然后是.ihx ..我怀疑我不应该直接上传这个文件,而是以某种方式对其进行后期处理以获取上传的实际原始字节?
任何帮助将受到高度赞赏=)
我正在努力将 linux 引入具有 16 Mb SDRAM 和 64 Mb 闪存的定制 Cortex-M7 板。该平台没有 MMU,没有共享库,没有 FLAT 可执行文件。
我在使用非常简单的 init.d shell 脚本启动 Busybox 系统时遇到问题。通过执行诸如“[”或“printf”之类的简单shell命令,系统就会耗尽内存。事实证明,每次执行这些命令之一时,系统都需要加载 FULL、一个且唯一的 busybox 可执行文件(在我的系统上为 650 Kb)。
所以问题是:如果系统总是要为在busybox 中执行的每个命令都在内存中加载一个巨大的可执行文件,那么这有多方便?我不明白在极快地退出内存的同时节省几兆字节的廉价和丰富的存储空间,但也许我忽略了一些东西。
我的平台是 Busybox 的用例吗?如果没有,是否有任何东西可以方便地在自己的可执行文件上构建 linux 系统实用程序?
提前致谢!
编辑:
根据他们自己的说法,Busybox “在编写时考虑了大小优化和有限的资源”,因此成为嵌入式系统中一种毋庸置疑的事实上的标准。但是他们的声明与 RAM(而非存储)受限系统上的上述问题有何关联?我相信这值得一些澄清。
跟进,系统详情:
内核已经为 XIP 编译,从 64 Mb 外部闪存执行。整个读/写 ext3 根文件系统(包括 busybox 二进制文件)现在驻留在微型 SD 卡上。Busybox 可执行文件使用 FLAT 格式(“bFLT”)并启用加载到 RAM 位,该位似乎在每次运行并发命令时在不同的内存块上导致新的加载,直到它耗尽拟合块。将busybox(整个/bin、/sbin)放在XIP 文件系统上的建议非常棒,它肯定会提高执行速度(当然,这个新文件系统需要驻留在64 Mb 外部闪存上)。我从未尝试过在这样的文件系统上执行“bFLT”(也不知道它是否有效),但我会对此进行研究/测试。
WebAssembly(缩写为 Wasm)是一种基于堆栈的虚拟机的二进制指令格式。Wasm 被设计为编程语言的可移植编译目标,支持在网络上部署客户端和服务器应用程序。
我在维基百科上读到过有关基于堆栈的虚拟机的信息。不过,我想知道基于 WebAssembly 堆栈的虚拟机驻留在哪里。它是否嵌入在 javascript 引擎中(例如,在 V8 上)?V8是否将.wasm文件交给另一个虚拟机来运行?
我认为没有办法只使用套接字枚举我的系统上的每个网络接口及其分配的IP地址.它是否正确?
我的意思是,在Linux中这可能是:
eth0: 192.168.1.5
wlan0: 192.168.0.5
lo: 127.0.0.1
Run Code Online (Sandbox Code Playgroud)
我不关心接口名称,只关心分配的IP地址.
我记得过去曾在Windows中使用过Win32(尽管我不记得如何).但有没有一种方法以便携方式做到这一点?
我真的对在全局命名空间中包含C stdlib函数感到困扰,并最终编写了诸如 ::snprintf 或 ::errno 或 struct ::stat 等内容,以区别于封闭命名空间中我自己的一些函数,其中那些使用了 c stdlib 函数。
然后我发现有一种方法可以在 std 命名空间中声明每个 C stdlib 函数(作为 STL):只需包含 < c(lib) > 而不是 < (lib).h > 所以我编辑了我的代码使用这些新的“c for c++”包括。
在Debian/GCC 4.3.4 上,我有两个问题:
1) #error 这个文件需要编译器和库支持即将到来的\ ISO C++ 标准,C++0x。此支持目前处于实验阶段,必须使用 -std=c++0x 或 -std=gnu++0x 编译器选项启用。
2)使用 -std=c++0x 我的程序编译得很好,但我没有修改 ::snprintf 或 ::time 等。每个 C stdlib 函数仍然在全局命名空间 =(!(不,我'我不使用命名空间 std甚至一次)
有什么想法吗?
例如..如何阻止 c stdlib 入侵我的全局命名空间?< c(lib) > 是下一个 C++ 标准的实验特性还是现在可以安全使用?
然后我还有另一个疑问,也许值得一个新问题.. 没有 cmalloc。我知道关于 new 替换 malloc 的整个历史以及原因。但是对于简单的纯字节缓冲区,没有 …
c++ ×7
linux ×7
gcc ×6
c ×4
embedded ×3
cortex-m ×2
linker ×2
8051 ×1
arm ×1
binary ×1
busybox ×1
casting ×1
constructor ×1
default ×1
dependencies ×1
dynamic ×1
globals ×1
include ×1
ldd ×1
macros ×1
networking ×1
operators ×1
sdcc ×1
sockets ×1
stl ×1
toolchain ×1
vector ×1
webassembly ×1
windows ×1