c++ - 如何解决“_start”错误的多重定义?
问题描述
我正在做一个项目,我必须比较来自传感器的传入数据。主要源代码在 C++ 中,还有一个 C 源文件、一个 .S 文件和一个 .h 文件。当我尝试链接这些文件时,它会显示错误,并且我不知道错误是什么。任何有关该问题的帮助将不胜感激。
我的 Makefile 看起来像:
all : main.cpp irq.c irq.h bootstrap.S
riscv32-unknown-elf-gcc -c irq.c bootstrap.S -march=rv32g -mabi=ilp32d -nostartfiles -Wl,--no-relax
riscv32-unknown-elf-g++ -c main.cpp -march=rv32g -mabi=ilp32d
riscv32-unknown-elf-g++ -o main main.o irq.o bootstrap.o -march=rv32g -mabi=ilp32d
dump-elf: all
riscv32-unknown-elf-readelf -a main
dump-code: all
riscv32-unknown-elf-objdump -D main
dump-comment: all
objdump -s --section .comment main
clean:
rm -f main`
主文件
#include "stdint.h"
extern "C"{
#include "irq.h"
}
#include<stdio.h>
#include<iostream>
using namespace std;
static volatile char * const TERMINAL_ADDR = (char * const)0x20000000;
static volatile char * const SENSOR_INPUT_ADDR = (char * const)0x50000000;
static volatile uint32_t * const SENSOR_SCALER_REG_ADDR = (uint32_t * const)0x50000080;
static volatile uint32_t * const SENSOR_FILTER_REG_ADDR = (uint32_t * const)0x50000084;
bool has_sensor_data = 0;
void sensor_irq_handler() {
has_sensor_data = 1;
}
void dump_sensor_data() {
while (!has_sensor_data) {
asm volatile ("wfi");
}
has_sensor_data = 0;
for (int i=0; i<64; ++i) {
*TERMINAL_ADDR = *(SENSOR_INPUT_ADDR + i) % 92 + 32;
}
*TERMINAL_ADDR = '\n';
}
int main() {
register_interrupt_handler(2, sensor_irq_handler);
*SENSOR_SCALER_REG_ADDR = 5;
*SENSOR_FILTER_REG_ADDR = 2;
for (int i=0; i<3; ++i)
dump_sensor_data();
return 0;
}
irq.c
https://github.com/agra-uni-bremen/riscv-vp/blob/master/sw/simple-sensor/irq.c
中断
https://github.com/agra-uni-bremen/riscv-vp/blob/master/sw/simple-sensor/irq.h
引导程序
https://github.com/agra-uni-bremen/riscv-vp/blob/master/sw/simple-sensor/bootstrap.S
输出应该是带有中断的 64 个随机字符。
错误是:
/opt/riscv/lib/gcc/riscv32-unknown-elf/8.3.0/../../../../riscv32-unknown-elf/bin/ld: /tmp/cckjuDlw.o: in function `.L0 ':
(.text+0x0): multiple definition of `_start'; /opt/riscv/lib/gcc/riscv32-unknown-elf/8.3.0/../../../../riscv32-unknown-elf/lib/crt0.o:(.text+0x0): first defined here
解决方案
您正在使用该-nostartfiles
选项,但在错误的位置。
您在编译步骤(-c
选项)中拥有它,而它属于链接。
-Wl,
选项也仅在链接时使用
推荐阅读
- python - 如何使用python条带支付确认支付访问网页
- javascript - 使用 NGINX 时无法在 Node.js 下使用 AJAX 发出 GET 请求
- mysql - 在 MySql 中创建一个 ID 为 CHV18000002 的列
- python - TypeError: can't pickle cv2.xfeatures2d_SIFT objects(在使用 joblib.Parallel 期间发生)
- reactjs - 连接 react-redux store 到 express + mysql 后端
- python - 在 python 中异或大量二进制数组的最快方法是什么?
- batch-file - 根据数字范围显示单个输出(if, goto)
- java - 我无法在 java gpdr 协议上加载表单
- javascript - Js对象分配到另一个对象的子字段
- proxy - 如何使用 Nginx 部署 JupyterHub?