首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

“undefined reference to“ 问题汇总及解决方法 ——非常非常好的一篇文章

code 1 (use -v to see invocation) 编译时报错了,这是最典型的undefined reference错误,因为在链接时发现找不到某个函数的实现文件。...$ gcc -o main main.c test.c 链接时缺少相关的库文件 我们把第一个示例中的test.c编译成静态库。...test.c:(.text+0x13): undefined reference to `func' collect2: ld returned 1 exit status 因此,在链接命令中给出所依赖的库时...,需要注意库之间的依赖顺序,依赖其他库的库一定要放到被依赖库的前面,这样才能真正避免undefined reference的错误,完成编译链接。...在c++代码中链接c语言的库 代码同示例一的代码一样,只是把main.c更改成了main.cpp。编译test.c,并打包为静态库。

14.4K31
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    Linux命令(65)——ld命令

    -E,--export-dynamic:对于ELF格式文件,创建动态链接的可执行文件时,把所有符号添加到动态符号表 -f ,--auxiliary=:对于ELF格式共享对象,设置...这仅在生成动态链接的ELF可执行文件时才有意义。默认的动态链接器通常是正确的,除非您知道正在做什么,否则不要使用该选项。...-u symbol>,--undefined=symbol>:强制指定符号在输出文件中作为未定义符号 -v,-V,--version:显示ld版本号 -warn-common:当一个通用符号和另一个通用符号结合时发出警告...给定C++目标文件test.o与main.o,生成可执行文件test.out。...+可执行文件,需要依赖很多系统库和相关的目标文件,比如C语言库libc.a,所以使用ld进行链接时,需要注意添加较长的命令选项,不然会报链接错误。

    17.7K13

    《程序员的自我修养》第三章学习笔记

    从结构上说,是编译后的可执行文件,只不过还没有经过链接 3.1 目标文件的格式 1,可执行文件的格式: Windows下的PE  和   Linux下的ELF 2,从广义上说,目标文件与可执行文件的格式几乎是一样的...3,可执行文件,动态链接库,静态链接库都按照可执行文件格式存储(Windows下是 PE-COFF格式,Linux下是ELF格式)。...魔数用来确认文件类型,操作系统在加载可执行文件的时候会确认魔数是否正确,若不正确则拒绝加载。...3.5.4 extern”C” 1,c++为了与c兼容,在符号的管理上,c++有一个用来声明或定义一个C的符号extern”C”的关键字用法。 2,可以让c++的名称修饰机制不作用。...5,弱引用与强引用: 强引用:假如链接时没找到该符号的定义,链接器就会报符号未定义错误。 弱引用:假如链接时没找到该符号的定义,链接器不会报错,默认其为0或是一个特殊值。

    1.2K60

    Linux 动态库 undefined symbol 原因定位与解决方法

    在使用动态库开发部署时,遇到最多的问题可能就是 undefined symbol 了,导致这个出现这个问题的原因有多种多样,快速找到原因,采用对应的方法解决是本文写作的目的。...api 符号被隐藏 如果动态库编译时被默认隐藏,外部代码使用了某个被隐藏的符号。...c++ abi 版本不一致 最典型的例子就是 gcc 4.x 到 gcc 5.x 版本之间的问题,在 4.x 编辑的动态库,不能在 5.x 中链接使用。...在遇到 undefined symbol 问题时,使用 readelf -d | grep rpath 查看: $ readelf -d libSXVideoEngineJni.so | grep rpath...错误类似: undefined symbol: "std::__cxx11 ***" 这种情况有一个折中办法就是在gcc 5.x 或以上 编译时,增加 -D_GLIBCXX_USE_CXX11_ABI

    7.8K10

    吴章金: 如何创建一个*可执行*的共享库

    共享目标文件(.so,共享库),协同可执行文件创建进程映像 Core dump(core),运行过程中崩溃时自动生成,用于调试 我们来看中间两类: 可执行文件 如果不引用外部库函数,那么所有符号地址是确定的...,执行加载后可直接运行 共享库 如果可执行文件用到外部库函数,那么需要通过动态链接器加载引用到的共享库并在运行时解析用到的相应符号 所以,前者和后者通常情况下是独立存在的,是联合行动的,两者差异明显:...可执行文件有标准的 C 语言程序执行入口 main,而共享库则并没有这类强制要求 后者为了确保可以灵活被多个可执行文件共享,所以,符号地址在链接时是相对的,在装载时动态分配和计算符号地址 接下来做个实验具体看看两者的区别.../libhello.so: undefined symbol: hello $ gcc -m32 -pie -fpie -rdynamic -o libhello.so hello.c -ldl $...先来回顾一下共享库,在本文第 2 节直接执行的时候马上出段错误,基本原因是共享库没有强制提供一个标准的 C 程序入口。

    1.1K20

    1、对symbol table 的symbol的理解2、Mach-O 初识 3、hook方式汇总

    1.2 symbol的分类 为了避免其他app利用symbol,执行其他app库的函数symbol 被分为2类 public symbol 和private symbol 第三类 stripped...II 、MSHookFunction 和 MSFindSymbol 2.1 MSHookFunction ---- MSHookFunction 作用于C 和C++函数通过编写汇编指令,在进行执行到...function 时 转而执行 replacement,同时保存在 function 的指令及其返回地址,使得用户可以选择性的执行 function ,...iOS 的底层是用 C C++ 实现的,编译之后生成的大都是 subroutine, class-dump 拿它没办法,只能使用IDA 工具。...3.1 文件类型: Executable: 应用的主要二进制 Dylib: 动态链接库(又称 DSO 或 DLL) Bundle: 不能被链接的 Dylib,只能在运行时使用 dlopen() 加载,

    1.3K30

    从最小依赖角度谈静态库与动态库的选择及配置策略

    本文将从“最小依赖”的角度出发,详细探讨在 C++ 项目中如何在静态库与动态库之间做出选择,并对常见的编译配置(如 /MT 与 /MD)的利弊进行分析。...在 C++ 开发中,静态库和动态库的选择以及运行时库的配置(/MT 静态链接与 /MD 动态链接)正是决定外部依赖数量的重要因素。...静态库与动态库:依赖最小化的抉择2.1 静态库概述静态库(.lib 文件)将目标文件归档为一个整体,编译时将所有代码直接链接进最终生成的可执行文件。...由于所有依赖在编译期就已经解决,运行时无需额外加载其他库文件,这大大降低了部署时对外部文件的依赖。优点: 零外部依赖:所有代码都打包进单一的可执行文件,方便在没有额外 DLL 支持的环境中运行。...重视内存优化与模块共享:undefined对于大型桌面应用或服务器软件,采用 /MD 动态链接可以利用系统中共享的 CRT DLL,降低内存占用,并在 CRT 更新时获得系统级的安全补丁。

    15410

    【运行时】FFI 链接 C ABI 动态链接库(实操分享)

    即,使【C ABI动态链接库】对编译输出的.exe文件可见。...其支持两种作法: 要么,徒手·复制·【C ABI动态链接库(文件)】至【编译输出.exe文件】所在文件夹内。...; } 最后,执行cargo run命令,完成: 编译源码 启动.exe可执行文件。 在程序初始化过程中,寻找【C ABI动态链接库】文件和链接之。...所以,我的下一个目标就是:在编译时,将【静态链接库.a文件】直接编译入.exe可执行文件内,来避免dll文件意外丢失的问题(当然,.exe文件的体积也会更大些)。...但是,我正遇到了一个mingw64的编译错误undefined reference to 'BCryptGenRandom'还未搞定。若你对此也有兴趣,请待我的后续更新...

    1.1K30

    ELF文件从形成到加载轮廓

    可以在运行时由多个程序共享加载,节省内存空间,但需要确保运行环境中有正确的库文件支持。 内核转储(Core Dumps) 用于存储当前进程的执行上下文,通常在进程因信号(如段错误)触发时生成。...记录每个段的起始位置、偏移量和长度,因为这些段在二进制文件中紧密排列,程序头表提供必要的描述信息以区分和加载这些段。 主要用于可执行文件和共享库,在加载时由操作系统或动态链接器使用。...静态链接会将静态库(.a)内容直接嵌入可执行文件;动态链接则引用动态库(.so),仅记录加载信息,运行时由动态链接器(如 /lib64/ld-linux-x86-64.so.2)加载。...链接阶段可能出现错误,如“undefined reference”(未定义引用),通常因缺少库文件或符号定义不一致引起。...如果程序使用动态库,加载时动态链接器(如 ld-linux.so)会解析 .dynamic 和 .got.plt Section,加载共享库并绑定符号。

    8010

    Windows应用程序是如何在国产系统上运行的

    C++ 不是一种编译语言吗,怎么还需要解释器?注意,这里的解释器和 Python 之类解释型语言的解释器不同,它只是一个动态加载器。简单说,其作用就是解析并加载其依赖项,然后交出控制权。...`__vdso_clock_getres' [LINUX_2.6] 运行可执行文件时,Linux 内核会检测到它是动态的,并且需要加载程序。...小结一下,在 Linux 上运行二进制程序的过程大致如下: 内核加载映像(≈二进制文件)并发现它是一个动态可执行文件; 内核加载动态加载器 (ld-linux-x86-64.so.2ld.so) 并赋予其控制权...如果我们只是从 Windows 可执行文件中取出代码,将其加载到内存中并将 %rip 指向正确的位置 - 处理器会很乐意执行它!...Wine 的作用 本质上,wine 是 Windows 可执行文件的动态加载器。

    8110

    Flutter iOS OC 混编 Swift 遭遇动态库和静态库问题填坑

    静态库和 Framework 的区别在于: *.a 的静态库类似于编译好的机械代码,源代码和库代码都被整合到单个可执行文件中,所以它会和设备架构绑定,并且不包含资源文件比如图片; Framework...支持将动态库、头文件和资源文件封装到一起的一种格式,其中动态库的简单理解是:不会像静态库一样被整合到一起,而是在运行或者运行时动态链接; 另外一个配置 use_modular_headers!...之后,有一定几率中奖各种 Undefined symbol 的错误问题,这时候不要慌,因为这是 Swfit 里有静态库导致。...很明显 Swift 不支持静态库的行为不科学,所以从 Xcode 9 开始 Swift 就开始支持静态库,而 CocoaPods 1.9.0 开始,引入了 use_frameworks!...所以修改 use_frameworks 配置,增加 static 之后可以看到 Undefined symbol 的错误都消失了,但是运行之后,可能会喜提新的问题: non-modular header

    1.7K10

    iOS编译原理

    语言 扩展了C语言的能力,使其具备面向对象设计的能力,相当于C的超集; OC代码中也可以有C和C++语句,它可以调用C函数,也可以通过C++对象访问方法; 4.OC与C++的比较 OC与C++都是从...C语言演变而来面向对象设计语言,也都兼容标准的C语言;但它们属于不同的面向对象学派; 两者最大的不同在于:OC提供了运行时的动态绑定机制,而C++是编译时静态绑定,并通过嵌入类和虚函数来模拟实现; OC...在编译阶段降低了编译要求提高了灵活性,而C++则是提高了编译要求,在编译过程中就发现更多的潜在错误,在运行前改正,降低了灵活性; 以下面的代码为例,在编译期间,C++认为是错误的,而OC则认为没有问题:...NSString *test =(id) [[NSArray alloc] init]; OC与C++在使用细节上的不同如下: 定型:OC是动态定型,可以允许根据字符串名字来访问方法和类,还可以动态链接和添加类...但是这些符号都会被记录下来,在运行时再通过dlopen和dlsym动态链接绑定; 动态链接:作用于运行时,这样的优势在于:诸多类似UIKit这样的共享库将不必包含在每一个App包里。

    1.6K20

    高级语言的编译:链接及装载过程介绍

    C++ 作为开发语言。...所以说 Windows 下面的 exe 可执行文件,lib 静态库,dll 动态库是不可以直接运行在 Linux 系统下面的;MacOS 下面的 Mach-O 可执行文件,静态链接库(a库),动态链接库...对于某一个动态链接库来说,所有使用这个库的可执行文件都共享同一块物理地址空间,这个物理地址空间在当前动态链接库第一次被链接时 load 到内存中。...-linux-gnu/libc.so.6 (0x00007fe202ae7000) /lib64/ld-linux-x86-64.so.2 (0x00007fe202eb2000) ldd 命令模拟加载可执行程序需要的动态链接库...如果链接库在某一个动态链接库中找到了该变量或者函数定义,链接库首先会把这个动态链接库写到可执行文件的依赖库中,然后生成这个当前变量或者函数的代理 symbol.

    1.4K80

    gcc编译之常见错误

    关于gcc问题解决 最近gcc编译出来的so库之类的使用总有问题,收集资料后简单整理下解决方法: 首先使用ldd 或者ldd -r XXX 查看文件所连接的so库有没有问题,目前我看到的经常是出现(undefined...symbol: lua_getfield)在c中,动态库中的symbol就是函数名,所以一看到就知道是lua库没有链接导致函数找不到加上-llua即可以解决。...而c++由于允许重载,就出现同一个函数名可能对应多个实际的函数问题,于是就会有name mangling ,而且这个mangling完全没有任何规范可循,由编译器自定。...解决方法:简而言之,就是用exturn “C” 对于经常加载一些so时,提示undified symbol,在gcc编译时,需要把链接动态库放最后面 对于编译时候找不到的so的问题,之前已经提过了,主要原因就是库文件没有导入...更多有关具体linux /etc/ld.so.conf 的相关信息参考动态装入器 关于gcc编译链接可参考 GCC/LD编译链接潜规则

    1.5K40

    Unix系统中nm命令展示目标文件符号的方法

    之前在调试makefile文件的时候,链接动态库出错:libsrcpbl.so: undefined reference to 'gcProgramName'。...当链接时,可能出现多个常用符号同名,这时如果该符号值都被定义了,那么会被当作未定义的引用(重定义错误)】 "D" "d" The symbol is in...Besides removing any initial underscore prepended by the system, this makes C++ function names...【将低级符号名解码(demangle)成用户级的名字,使得C++函数名具有可读性。为了区分重载函数,c++编译器会将函数返回值/参数等信息附加到函数名称中去组成一个mangle过的符号。...【显示动态符号(只对动态目标有效,如特定类型的共享库)】 -f format --format=format Use the output format

    16910

    5 图看懂 Node 模块加载原理

    运行时都是由 C++层来完成的: addon module cpp 关键在于通过dlopen()/uv_dlopen加载 C++动态链接库(即.node文件)。...N-API:napi_module_register_by_symbol 之所以能够从外部取到扩展模块的module实例,是因为扩展模块有自注册机制: // 模块注册时 extern "C" void...(如fs.writeFile、fs.writeFileSync等) 本质上都是 C++类库,最主要的区别在于核心模块会被编译到 Node.js 安装包中(包括上层封装的 JS 代码,编译时就已经链接到可执行文件中了...),而扩展模块需要在运行时动态加载 P.S.关于 C++动态链接库、静态库的更多信息,见Node.js C++扩展入门指南 因此,与前几种模块相比,核心模块的加载过程稍复杂些,分为 4 部分: (预编译阶段...)“编译”JS 代码 (启动时)加载 JS 代码 (启动时)注册 C++模块 (运行时)加载核心模块(包括 JS 代码及其引用到的 C++模块) core module 其中比较有意思的是 JS2C 转换与核心

    1.3K20

    lnk2001 lnk1120_lnk1120

    当试图从文件外部访问任何没有在该文件内声明的静态变量时将导致编译错误或LNK2001。   函数内声明的变量(局部变量) 只能在该函数的范围内使用。   C++ 的全局常量只有静态连接性能。...3.使用/MD选项编译时,既然所有的运行库都被保留在动态链接库之内,源文件中对“func”的引用,在目标文件里即对“__imp__func” 的引用。...如果创建C++库时打开了函数内联(/Ob1或/Ob2),但是在描述该函数的相应头文件里却关闭了函数内联(没有inline关键字),这时将得到该错误信息。...在 Visual C++ .NET 2003 中,如果使用了 /clr 而未将 CRT 链接到可执行文件,将生成此错误。...有关可验证代码的更多信息,请参见产生可验证的 C++ 托管扩展组件。有关从托管 C++ 项目创建纯 MSIL 输出文件的更多信息,请参见将 C++ 托管扩展项目从混合模式转换成纯 IL。

    1.1K20
    领券