相关疑难解决方法(0)

连接子做什么?

我一直在想.我知道编译器会将您编写的代码转换为二进制文件,但链接器的作用是什么?对我来说,它们一直是个谜.

我粗略地理解'链接'是什么.当对库和框架的引用添加到二进制文件时.除此之外我什么都不懂.对我来说它"只是有效".我也理解动态链接的基础知识,但没有太深入.

有人可以解释这些条款吗?

c++ linker dynamic-linking

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

70
推荐指数
2
解决办法
6万
查看次数

从内存中的特定地址开始初始化数组 - C编程

你知道如何从内存中的特定地址开始初始化结构数组(不是虚拟的物理DDR内存).我正致力于在SoC(ARM-FPGA)上实现TxRx.基本上ARM(PS)和FPGA(PL)通过使用共享RAM存储器相互通信.目前我正在处理发送器端,因此我需要不断加载从MAC层到内存的数据包,然后我的Tx读取数据并将其发送到空中.为了实现这一点,我想在(ARM)端实现循环FIFO缓冲,以便我可以将最多6个数据包存储到缓冲区并逐个发送,同时在已发送的包的位置加载其他数据包.因为我需要使用特定的内存地址,我感兴趣的是可以初始化将存储在内存中特定地址的结构数组.例如,我希望我的数组从地址0x400000开始,结束地址0x400000 + MaximumNumberOfPackets x SizeOfPackets我知道如何为结构的一个实例化做这样的事情,例如:buffer_t*tmp =(struct buffer_t*)234881024;

但是如何为结构数组做到这一点?

c arrays shared-memory

10
推荐指数
1
解决办法
8461
查看次数

声明一系列常量

我有这可能是一个声明问题:

我声明了一个const int数组:

const int my_array[] = {
    // data...
}
Run Code Online (Sandbox Code Playgroud)

然后我需要声明窗体的另一个字节数组:

00 aa 01 bb 02 cc
Run Code Online (Sandbox Code Playgroud)

其中aabbcc是const int内存中的24位地址(我精确地为一个非常特殊的平台编写代码,这解释了这一点),所以我写道:

const char my_other_array[] = {
    00, (my_array >> 16) & 0xFF, 01, (my_array >> 8) & 0xFF, 02, my_array & 0xFF
}
Run Code Online (Sandbox Code Playgroud)

但我得到这个错误:

error: invalid operands to binary >>
error: initializer element is not constant
Run Code Online (Sandbox Code Playgroud)

我考虑过铸造my_array:

const char my_other_array[] = {
    00, (((const u32) my_array) >> 16) & 0xFF, 01, (((const u32) my_array) >> 8) & 0xFF, 02, ((const u32) …
Run Code Online (Sandbox Code Playgroud)

c arrays const

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

如何在嵌入式系统上创建指向寄存器的 constexpr 指针

我希望能够配置一个类,使其能够在其成员函数中访问硬件。假设我们有一个 avr 设备,我们可以简单地访问硬件,就像PORTA = 0x00;将 a 写入0x00io 内存空间一样。该问题对于每种嵌入式内存 io 访问都是通用的,而不是 avr 特有的。

但如果我现在想使用一个可以参数化的类,C++ 似乎已经关闭了所有的大门,因为似乎根本不可能定义任何类型的指针类型并给它们一个 constexpr 值。

在某些之前的编译器版本中,我们能够运行这样的代码:constexpr reference to avr port address

但现在所有尝试为 constexpr 值的指针赋值的尝试都会失败,因为reinterpret_cast在这种情况下不能再使用。

作为一个肮脏的黑客,我尝试过但失败了:

struct ONE 
{
    static constexpr volatile uint8_t* helper=nullptr;
    static constexpr volatile uint8_t* portc=&helper[100];
};
Run Code Online (Sandbox Code Playgroud)

失败并显示:

struct ONE 
{
    static constexpr volatile uint8_t* helper=nullptr;
    static constexpr volatile uint8_t* portc=&helper[100];
};
Run Code Online (Sandbox Code Playgroud)

也失败:

 // for AVR PORTB is defined in io.h like:
 #define PORTB (*(volatile uint8_t *)((0x05) + 0x20))

 constexpr …
Run Code Online (Sandbox Code Playgroud)

c++ pointers constexpr

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

如何删除警告:link.res包含输出节;你忘了-T吗?

我正在使用fpc编译器,并且想删除此警告。我已经阅读了fpc的选项,但找不到该怎么做。这可能吗?它在我运行命令时出现:

fpc foo.pas
Run Code Online (Sandbox Code Playgroud)

出:

目标操作系统:Linux for i386编译foo.pas链接p2 / usr / bin / ld:警告:link.res包含输出节;你忘了-T吗?汇编79行,0.1秒

linux pascal ld fpc

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

什么是绝对符号以及如何在 C 中定义它?

在手册页中nm。它说

\n\n
\n

\xe2\x80\x9cA\xe2\x80\x9d 符号的值是绝对的,不会因进一步链接而改变。

\n
\n\n

但是,我不知道这意味着什么。如何在 C 中定义一个变量或其他东西以使其值绝对?

\n\n

test.c如果我在其文件范围内声明一个变量

\n\n
int a;\n
Run Code Online (Sandbox Code Playgroud)\n\n

然后在 的输出中nm,a 的条目在我的机器上将如下

\n\n
int a;\n
Run Code Online (Sandbox Code Playgroud)\n\n

所以我想知道我该怎么做才能使nm变量的输出 \xe2\x80\x9cA\xe2\x80\x9d 。而且我不知道 \xe2\x80\x9cabsolute\xe2\x80\x9d 是什么意思。

\n

c linker relocation ld linker-scripts

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

使用链接器命令将 C 中的数组分配到特定位置

我是初学者...我想写入嵌入式闪存中的特定内存位置...如何在我的 C 头文件中提及它?然后使用链接器脚本将其与特定的内存位置链接。现在我已经将数组声明为 extern 并且它可以正确编译。在喜欢的同时,我需要告诉链接器我在这个特定位置需要它。它应该在 .ld 文件中给出吗?什么是 .dld 文件?这不适用于 GCC,适用于 diab 编译器。我看过一个用于冒泡排序的示例代码 bubble.dld。但是在某些项目中,在制作项目时会创建 .dld 文件。它实际上是在哪一步创建的?

c linker linker-errors ld extern

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