未定义弱函数的引用(静态库+gcc)(代码片段)

author author     2023-05-10     677

关键词:

大家好。首先,我想向大家介绍我的问题!

我正在使用Atollic TrueStudio开发嵌入式系统。在这个系统中,我有一个驱动程序层(构建为一个静态库。这个库基本上包含STM32 HAL,这个库包含很多弱函数)。这些库正在使用ARM GCC进行编译,效果很好。我可以在其他项目中链接它,它确实可以正常工作。

第二部分是问题,因为我想在项目中实现单元测试!

为此,我为同一个驱动程序层静态库(带有STM32 HAL代码的静态库)创建了另一个配置,但这次我用MinGW编译它。编译工作,但当我尝试将此库链接到另一个项目(可执行项目)。链接器返回“未定义的引用...”(下图)。

PS:问题在于链接器,因为项目找到了声明弱函数的位置。它找不到它定义的地方!

编辑

这是主要代码

#include <MbedOS/platform/mbed_error.h>

int main(void)

   error("Stream obj failure, errno=%d
",

   return 0;

这是定义函数的地方(在静态库中)mbed_error.c

#include <MbedOS/platform/mbed_error.h>

static uint8_t error_in_progress = 0;

WEAK void error(const char* format,
                ...)


   // Prevent recursion if error is called again
   if (error_in_progress)
   
      return;
   

   error_in_progress = 1;

   #ifndef NDEBUG
      va_list arg;
      va_start(arg,
               format);
      mbed_error_vfprintf(format,
                          arg);
      va_end(arg);
   #endif

   exit(1);

这是mbed_error.h文件

#ifdef __cplusplus
extern "C"

#endif
void error(const char* format,
           ...);

#ifdef __cplusplus

#endif

这是控制台的结果

13:45:44 **** Build of configuration Debug for project testeLINKER ****
make all 
gcc -o "testeLINKER.elf"  ./src/main.o   -lSTM32F7_Driver_Layer -L"E:TrueStudio_ProjectsSTM32F7_Driver_LayerProjetoTrueStudioUnitTestLibrary"
./src/main.o: In function `main':
E:TrueStudio_Projects	esteLINKERDebug/../src/main.c:33: undefined reference to `error'
collect2.exe: error: ld returned 1 exit status
make: *** [testeLINKER.elf] Error 1

13:45:44 Build Finished (took 460ms)

编辑2静态库的nm输出如下(只是其中一个功能较弱的文件)

    C:Program Files (x86)AtollicTrueSTUDIO for STM32 9.0.0PCToolsin>nm E:TrueStudio_ProjectsSTM32F7_Driver_LayerProjetoTrueStudioUnitTestLibrarySourceMbedOSplatformmbed_error.o
00000000 b .bss
00000000 d .data
00000000 N .debug_abbrev
00000000 N .debug_aranges
00000000 N .debug_info
00000000 N .debug_line
00000000 r .eh_frame
00000000 r .rdata$zzz
00000000 t .text
00000000 T .weak._error.
         w _error
00000000 b _error_in_progress
         U _exit
         U _mbed_error_vfprintf
答案

对于每个可能与我有同样怀疑的人。这是答案。

问题是PE32文件格式不支持弱连接。

linux下gcc编译提示错误,,在函数_start中main未定义的引用

...尝试链接成可执行文件,然而foo.c的代码中没有main函数的定义,所以最终无法成功链接,故报错。参考技术A你不给出代码,很难定位问题的。 查看详情

c ++对静态库函数的“未定义引用”[重复]

】c++对静态库函数的“未定义引用”[重复]【英文标题】:c++\'undefinedreference\'tostaticlibraryfunction[duplicate]【发布时间】:2018-04-1504:48:01【问题描述】:Ihavere-askedthisquestionhere...【问题讨论】:【参考方案1】:您需要在Math.h中包含... 查看详情

静态库的未定义引用和奇怪的内容

】静态库的未定义引用和奇怪的内容【英文标题】:undefinedreferenceandstrangecontentofstaticlibrary【发布时间】:2010-06-1616:51:20【问题描述】:嘿,我是真正的gcc新手,如果这是一个愚蠢的问题,请原谅。我想在android中使用opencv,因此... 查看详情

强制 GCC 通知共享库中未定义的引用

】强制GCC通知共享库中未定义的引用【英文标题】:ForceGCCtonotifyaboutundefinedreferencesinsharedlibraries【发布时间】:2010-03-0113:46:28【问题描述】:我有一个与另一个(第三方)共享库链接的共享库。然后在我的应用程序中使用dlopen加... 查看详情

本地创建的对象的 gcc 未定义引用

】本地创建的对象的gcc未定义引用【英文标题】:gccundefinedreferencewithlocalcreatedObjects【发布时间】:2015-02-0811:07:21【问题描述】:我是C++新手,我在Windows下使用GCC编译,当我创建任何本地对象时,编译器会发出错误消息“未定义... 查看详情

swift弱化函数可帮助您将实例弱绑定到静态方法引用(代码片段)

查看详情

与代码块一起使用时,使用 Visual Studio 创建的静态库显示对 Myfunction 的未定义引用

...使用时,使用VisualStudio创建的静态库显示对Myfunction的未定义引用【英文标题】:StaticLibraryCreatedWithVisualStudioShowsUndefinedReferenceToMyfunctionwhenusedwithcodeblocks【发布时间】:2015-04-1015:09:28【问题描述】:您好,我使用MicrosoftVisualStudio20... 查看详情

对另一个静态库中的静态库方法的未定义引用

】对另一个静态库中的静态库方法的未定义引用【英文标题】:Undefinedreferencetostaticlibrarymethodsinsideanotherstaticlibrary【发布时间】:2017-04-2412:14:12【问题描述】:由于Cmake损坏而无法安装名为libzippp的C++libzip包装器后,我决定自己... 查看详情

gcc:未定义的引用错误

】gcc:未定义的引用错误【英文标题】:gcc:UndefinedReferenceError【发布时间】:2014-03-1522:01:48【问题描述】:我想使用ffmpeg/libavfilter/lavfutils.h中定义的函数\'ff_load_image\'。program.c#include"../ffmpeg/libavfilter/lavfutils.h"intmain()uint8_t*data;intli... 查看详情

弱符号与强符号,弱引用与强引用

...始化的全局变量为弱符号。此处弱符号与强符号均是针对定义来说的,不是针对符号的引用。也可以通过GCC的“__attribute__((weak))”来定义任何一个强符号为弱符号。 [cpp] viewplain copyextern in ext; &nbs 查看详情

/usr/bin/ld: 未定义的静态库引用

】/usr/bin/ld:未定义的静态库引用【英文标题】:/usr/bin/ld:undefinedreferencetostaticlibrary【发布时间】:2020-05-2908:46:52【问题描述】:我得到了以下cmake文件:cmake_minimum_required(VERSION3.17)project(blsbench2)set(CMAKE_CXX_STANDARD14)set(SOURCE_FILESmain.c 查看详情

一个弱声明问题(代码片段)

...链接时符号选择理解有误.问题背景在一个库(liba.a)中重新定义了一个weak属性的函数(func_a),在同一库中调用该函数时链接了弱声明的函数版本,但是当通过另一个库(libb.a)的库函数(func_b)调用(func_a)时最终链接的是强声明的函数版本.... 查看详情

链接器错误,使用 g++ 链接到由 gcc 编译的库,未定义对该函数的引用

】链接器错误,使用g++链接到由gcc编译的库,未定义对该函数的引用【英文标题】:Linkererror,usingg++tolinktoalibrarycompiledbygcc,undefinedreferencetothatfunction【发布时间】:2015-06-2016:20:47【问题描述】:我写了一个C函数,它调用openssl/sha.h... 查看详情

对共享库函数的未定义引用

】对共享库函数的未定义引用【英文标题】:undefinedreferencetothesharedlibraryfunction【发布时间】:2009-06-1211:39:11【问题描述】:我在Linux中实现了一个共享库并尝试对其进行测试,但我收到错误“未定义对`CEDD(char*)\'的引用”。我使... 查看详情

如何使静态库中的 gcc 链接强符号覆盖弱符号?

】如何使静态库中的gcc链接强符号覆盖弱符号?【英文标题】:Howtomakegcclinkstrongsymbolinstaticlibrarytooverwriteweaksymbol?【发布时间】:2012-10-2614:46:44【问题描述】:我的问题可以总结如下:bar.c:#include<stdio.h>voidbar()printf("bar\\n");m... 查看详情

静态 OpenCV 库中的未定义引用

】静态OpenCV库中的未定义引用【英文标题】:UndefinedreferencesinstaticOpenCVlibraries【发布时间】:2016-10-0712:14:33【问题描述】:我有一个使用OpenCV3.1的C++项目,并且使用共享库可以正常工作。但现在我想使用静态库(位于项目目录中... 查看详情

linux自己写的静态库gcc报错

gcc-L.main.c-oapp定义在头文件中的函数main函数调用为未定义undefinedreferenceto`add'-l选项更离谱如下gcc-l/home/zizz/linuxc/libstatic_lib.amain.c-oapp报错:/usr/bin/ld:cannotfind-l/gccmain.c-static./static_lib.a-oapp只有-static选项能编译通过,为什么呢?gcc... 查看详情

gcc找不到静态库中的函数

您好,在使用GCC编译器时,如果找不到静态库中的函数,可能是由于以下几个原因:1.您没有正确指定静态库文件的路径。GCC编译器只能在指定的路径中搜索静态库文件,如果您没有指定正确的路径,就会出现找不到静态库文件... 查看详情