In function `allocate_stack‘ 奇怪错误解法

文章描述了在HIVIEW项目中遇到的链接错误,涉及libHivi.a和libpthread.a库,以及glibc-2.24版本的未定义引用问题,解决方法是检查是否正确加载依赖库并选择加载现有版本。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

/home/zhangy2/work/work2/HIVIEW-master/lib/3516d/libHivi.a: In function allocate_stack': /home/sying/SDK_CPU_UNIFIED/build/script/arm-himix200-linux/arm_himix200_build_dir/src/glibc-2.24/nptl/allocatestack.c:480: undefined reference to _dl_stack_flags’
/home/zhangy2/work/work2/HIVIEW-master/lib/3516d/libHivi.a: In function unwind_stop': /home/sying/SDK_CPU_UNIFIED/build/script/arm-himix200-linux/arm_himix200_build_dir/src/glibc-2.24/nptl/unwind.c:94: undefined reference to __pointer_chk_guard_local’
/home/zhangy2/work/work2/HIVIEW-master/lib/3516d/libHivi.a: In function __pthread_initialize_minimal_internal': /home/sying/SDK_CPU_UNIFIED/build/script/arm-himix200-linux/arm_himix200_build_dir/src/glibc-2.24/nptl/nptl-init.c:437: undefined reference to _dl_pagesize’
/home/sying/SDK_CPU_UNIFIED/build/script/arm-himix200-linux/arm_himix200_build_dir/src/glibc-2.24/nptl/nptl-init.c:437: undefined reference to _dl_init_static_tls' /home/sying/SDK_CPU_UNIFIED/build/script/arm-himix200-linux/arm_himix200_build_dir/src/glibc-2.24/nptl/nptl-init.c:437: undefined reference to _dl_wait_lookup_done’
/home/zhangy2/work/work2/HIVIEW-master/lib/3516d/libHivi.a: In function __pthread_get_minstack': /home/sying/SDK_CPU_UNIFIED/build/script/arm-himix200-linux/arm_himix200_build_dir/src/glibc-2.24/nptl/nptl-init.c:480: undefined reference to _dl_pagesize’
collect2: error: ld returned 1 exit status
make: *** [Makefile:27: bin/app.exe] Error 1

解决办法,查看依赖库libpthread.a 要么不加载,要么就加载现有的

<think>我们正在讨论C/C++中的宏定义,特别是#define ALLOCATE_EXTERN的用法。根据用户提供的引用,我们注意到引用[1]中提到了使用#define进行明示常量和宏替换函数的例子,引用[2]则涉及extern和static的使用。虽然用户提供的引用中没有直接提到ALLOCATE_EXTERN,但我们可以结合宏定义和extern关键字的常规用法来推断。 在C/C++中,宏定义(#define)通常用于定义常量、宏函数或条件编译。而extern关键字用于声明一个变量或函数是在其他文件中定义的,告诉编译器该符号在其他地方被分配了存储空间。 那么,ALLOCATE_EXTERN可能是一个自定义的宏,用于处理变量的声明和定义分离的问题。具体来说,它可能用于在头文件中声明变量为extern,而在一个源文件中定义该变量(分配存储空间)。这样可以在多个文件中共享同一个变量。 下面是一个典型的用法: 1. 在一个头文件(例如:globals.h)中,我们使用宏来声明变量为extern: ```c #ifndef GLOBALS_H #define GLOBALS_H // 声明宏 ALLOCATE_EXTERN // 当在头文件中时,它展开为extern // 当在某个源文件中时,它可能被定义为空或者定义为其他以进行实际定义 #ifdef DEFINE_GLOBALS #define ALLOCATE_EXTERN #else #define ALLOCATE_EXTERN extern #endif ALLOCATE_EXTERN int global_variable; #endif // GLOBALS_H ``` 2. 在一个源文件(例如:globals.c)中,我们定义宏DEFINE_GLOBALS,然后包含头文件,这样就会在该文件中定义变量(分配存储空间): ```c #define DEFINE_GLOBALS #include "globals.h" // 此时,ALLOCATE_EXTERN被定义为空,因此int global_variable;就变成了定义(分配存储空间) ``` 3. 在其他源文件中,我们只需要包含头文件globals.h,由于没有定义DEFINE_GLOBALS,所以ALLOCATE_EXTERN被定义为extern,因此是声明而不是定义。 这样,我们就确保了全局变量global_variable在整个项目中只有一次定义(在globals.c中),而其他文件通过头文件得到的是extern声明。 因此,ALLOCATE_EXTERN宏的作用是帮助我们管理全局变量的声明和定义,避免重复定义错误。 §§相关问题§§ 1. 在C/C++中,extern关键字的具体作用是什么? 2. 如何避免头文件中全局变量的重复定义? 3. 除了使用宏,还有哪些方法可以管理全局变量? 4. 在大型项目中,使用全局变量有哪些优缺点?</think>在C/C++中,`#define ALLOCATE_EXTERN` 是一种**自定义宏模式**,主要用于解决全局变量的声明和定义分离问题。其核心作用是:**在头文件中声明全局变量为`extern`,在特定源文件中进行实际定义**。以下是详细解析: --- ### 一、用途和原理 1. **解决重复定义问题** 当多个源文件包含同一个头文件时,头文件中的全局变量若直接定义(如 `int global_var;`),会导致链接错误(多重定义)。 通过 `ALLOCATE_EXTERN` 宏: - **头文件**中声明为 `extern`(不分配内存) - **唯一源文件**中取消 `extern` 属性(实际分配内存) 2. **宏的工作机制** 示例代码: ```c // 头文件 globals.h #ifndef GLOBALS_H #define GLOBALS_H #ifdef DEFINE_GLOBALS #define ALLOCATE_EXTERN // 空定义(用于实际定义) #else #define ALLOCATE_EXTERN extern // 声明为extern #endif ALLOCATE_EXTERN int global_counter; // 展开为 extern int global_counter; 或 int global_counter; #endif ``` ```c // 源文件 globals.c(实际分配内存) #define DEFINE_GLOBALS // 激活定义模式 #include "globals.h" // 展开为 int global_counter;(分配内存) ``` ```c // 其他源文件 main.c #include "globals.h" // 展开为 extern int global_counter;(仅声明) ``` --- ### 二、典型应用场景 1. **跨文件共享全局变量** 如共享配置参数、硬件寄存器映射表等: ```c // 寄存器映射表(头文件中声明) ALLOCATE_EXTERN volatile uint32_t * const UART0_BASE; ``` 2. **模块化设计** 避免全局变量污染命名空间,仅通过头文件暴露必要变量。 3. **条件编译管理** 结合 `#ifdef` 实现不同平台的变量定义: ```c #ifdef PLATFORM_X ALLOCATE_EXTERN int buffer_size = 256; #else ALLOCATE_EXTERN int buffer_size = 128; #endif ``` --- ### 三、对比直接使用 `extern` | 方法 | 优点 | 缺点 | |--------------------|-------------------------------|--------------------------| | 直接 `extern` | 简单直观 | 需手动确保唯一定义 | | `ALLOCATE_EXTERN` | 自动管理声明/定义,减少错误 | 增加宏定义复杂性 | --- ### 四、注意事项 1. **定义源文件必须唯一** 仅在一个源文件中 `#define DEFINE_GLOBALS`,否则引发重定义错误。 2. **初始化位置** 变量初始化只能在定义源文件中进行: ```c // globals.c #define DEFINE_GLOBALS #include "globals.h" int global_counter = 0; // 正确初始化位置 ``` 3. **类型安全** 确保头文件中的类型声明与定义源文件一致。 > 此模式常见于嵌入式系统和大型项目,如引用[2]中跨文件管理 `global_var` 的场景[^2]。 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值