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

一个奇怪链接问题

前言 链接是代码生成可执行文件中一个非常重要过程。我们使用一些库函数时,有时候需要链接库,有时候又不需要,这是为什么呢?了解一些链接基本过程,能够帮助我们在编译时解决一些疑难问题。...: gcc -o expTest expTest.c /tmp/ccx5lXbS.o:函数main: expTest.c:(.text+0x20):‘exp’未定义引用 collect2:...error: ld returned 1 exit status 我们发现,同样编译方法编译不过了,提示‘exp’未定义引用,并且抛出链接出错。...再次编译运行: gcc -lm -o expTest expTest.c /tmp/ccYT3E65.o:函数main: expTest.c:(.text+0x20):‘exp’未定义引用...这个就涉及到链接器工作原理了,在此只简单说明一下:链接过程,需要进行符号解析,并且是按照顺序解析;如果库链接在前,就可能出现库符号不会被需要,链接器不会把它加到未解析符号集合,那么后面引用这个符号目标文件就不能解析该引用

1.6K20

【C++】undefined reference to 问题常见解决方法

collect2: ld returned 1 exit status 这就是最典型undefined reference错误,因为链接时发现找不到某个函数实现文件,本例test.o...从上图可以看出,main.c调用了test.c函数,test.c又调用了fun.c函数。 首先,我们先fun.c,test.c,main.c进行编译,生成 .o文件。...同样,如果我们库或者程序引用了第三方库(如pthread.a)则同样链接时候需要给出第三方库路径和库文件,否则就会得到undefined reference错误。...+0x13): undefined reference to `func' collect2: ld returned 1 exit status 因此,我们需要注意,链接命令给出所依赖库时...c++代码链接c语言库 如果你库文件由c代码生成,则在c++代码链接库函数时,也会碰到undefined reference问题。下面举例说明。

2.6K21
您找到你想要的搜索结果了吗?
是的
没有找到

Linux命令(65)——ld命令

脚本命令“FORCE_COMMON_ALLOCATION”具有相同效果 -defsym:输出文件创建指定全局符号 -demangle:错误消息还原符号名称 -e :使用指定符号作为程序初始执行点...如果输出格式支持Unix样式幻数,则将输出标记为"NMAGIC" -noinhibit-exec:生成输出文件,即使出现非致命链接错误。通常,如果链接器链接过程遇到错误,它将不会生成输出文件。...size默认为1 -split-by-reloc[=count]:按照指定长度输出文件创建额外段 --section-start==:输出文件中指定地址定位指定段...org>:使用指定地址作为bss段起始点 -t,--trace:处理输入文件时显示它们名称 -u ,--undefined=:强制指定符号输出文件作为未定义符号...warn-once:对于每个未定义符号只发出一次警告 -warn-section-align:如果为了对齐而改动了输出段地址,则发出警告 --whole-archive:对于指定存档文件,存档包含所有文件

17.1K01

CMake和静态库顺序

如果静态库不熟悉,需要结构nm等工具来解决顺序问题。...但也可以偷懒,不关心静态库顺序问题ld为此提供了start-group和end-group两个选项,让包含在这两者间静态库顺序可以随意。...前面说了start-group和end-group是ld选项,是链接选项,不是gcc/g++编译选项,直接命令行或其它编译方式也可以使用,比如命令行方式: g++ -g -o x x.cpp -Wl...,--start-group libX2.a libX1.a libX3.a -Wl,--end-group 附1:链接静态库顺序问题 链接静态库时,如果多个静态库之间存在依赖关系,则有依赖关系静态库之间存在顺序问题...gcc -c a.c ar cr liba.a a.o gcc -c b.c ar cr libb.a b.o 虽然libb.a使用到了liba.o一些函数,但并不会将它们定义包含进来,所以链接

6.5K50

Linux C语言多线程编程实例解析

另外,因为pthread库不是linux系统库,所以进行编译时候要加上-lpthread,否则编译不过,会出现下面错误   thread_test.c: 函数 ‘create’ :   thread_test.c...:7: 警告: 在有返回函数,程序流程到达函数尾   /tmp/ccOBJmuD.o: In function `main':thread_test.c:(.text+0x4f):‘pthread_create...’未定义引用   collect2: ld 返回 1   此例子介绍了创建线程方法   下面例子介绍向线程传递参数。   ...fs@ubuntu:~/qiang/thread$   例程总结:   可以看出来,我们main函数传递整行指针,传递到我们新建线程函数。   ...线程正常退出方式:   (1) 线程只是从启动例程返回返回值是线程退出码   (2) 线程可以被另一个进程进行终止   (3) 线程自己调用pthread_exit函数   两个重要函数原型

5.5K20

Linux多线程编程实例解析

另外,因为pthread库不是linux系统库,所以进行编译时候要加上-lpthread,否则编译不过,会出现下面错误   thread_test.c: 函数 ‘create’ :   thread_test.c...:7: 警告: 在有返回函数,程序流程到达函数尾   /tmp/ccOBJmuD.o: In function `main':thread_test.c:(.text+0x4f):‘pthread_create...’未定义引用   collect2: ld 返回 1   此例子介绍了创建线程方法   下面例子介绍向线程传递参数。   ...fs@ubuntu:~/qiang/thread$   例程总结:   可以看出来,我们main函数传递整行指针,传递到我们新建线程函数。   ...线程正常退出方式:   (1) 线程只是从启动例程返回返回值是线程退出码   (2) 线程可以被另一个进程进行终止   (3) 线程自己调用pthread_exit函数   两个重要函数原型

1.4K20

Linux多线程编程实例解析

另外,因为pthread库不是linux系统库,所以进行编译时候要加上-lpthread,否则编译不过,会出现下面错误   thread_test.c: 函数 ‘create’ :   thread_test.c...:7: 警告: 在有返回函数,程序流程到达函数尾   /tmp/ccOBJmuD.o: In function `main':thread_test.c:(.text+0x4f):‘pthread_create...’未定义引用   collect2: ld 返回 1   此例子介绍了创建线程方法   下面例子介绍向线程传递参数。   ...fs@ubuntu:~/qiang/thread$   例程总结:   可以看出来,我们main函数传递整行指针,传递到我们新建线程函数。   ...线程正常退出方式:   (1) 线程只是从启动例程返回返回值是线程退出码   (2) 线程可以被另一个进程进行终止   (3) 线程自己调用pthread_exit函数   两个重要函数原型

2.3K40

Linux多线程实例解析

另外,因为pthread库不是linux系统库,所以进行编译时候要加上-lpthread,否则编译不过,会出现下面错误   thread_test.c: 函数 ‘create’ :   thread_test.c...:7: 警告: 在有返回函数,程序流程到达函数尾   /tmp/ccOBJmuD.o: In function   `main':thread_test.c:(.text+0x4f):‘pthread_create...’未定义引用   collect2: ld 返回 1   此例子介绍了创建线程方法   下面例子介绍向线程传递参数。   ...fs@ubuntu:~/qiang/thread$   例程总结:   可以看出来,我们main函数传递整行指针,传递到我们新建线程函数。   ...线程正常退出方式:   (1) 线程只是从启动例程返回返回值是线程退出码   (2) 线程可以被另一个进程进行终止   (3) 线程自己调用pthread_exit函数   两个重要函数原型

1.5K20

Linux之多线程编程实例

另外,因为pthread库不是linux系统库,所以进行编译时候要加上-lpthread,否则编译不过,会出现下面错误   thread_test.c: 函数 ‘create’ :   thread_test.c...:7: 警告: 在有返回函数,程序流程到达函数尾   /tmp/ccOBJmuD.o: In function `main':thread_test.c:(.text+0x4f):‘pthread_create...’未定义引用   collect2: ld 返回 1   此例子介绍了创建线程方法   下面例子介绍向线程传递参数。   ...fs@ubuntu:~/qiang/thread$   例程总结:   可以看出来,我们main函数传递整行指针,传递到我们新建线程函数。   ...线程正常退出方式:   (1) 线程只是从启动例程返回返回值是线程退出码   (2) 线程可以被另一个进程进行终止   (3) 线程自己调用pthread_exit函数   两个重要函数原型

1.5K10

C语言线程库使用

arg: 作为实参传递到 start_routine 指针指向函数内部 返回值:线程创建成功返回 0,创建失败返回对应错误号 2.2 创建线程 下面是创建线程示例代码,创建过程中一定要保证编写线程函数与规定函数指针类型一致...): undefined reference to `pthread_create' collect2: error: ld returned 1 exit status 错误原因是因为编译器链接不到线程库文件...正确编译命令为: # pthread_create 函数定义某一个库, 编译时候需要加库名 pthread $ gcc pthread_create.c -lpthread $ ....也就是说程序 main() 函数,通过指针变量 ptr 或者通过结构体变量 p 都可以读出子线程传出数据。 5....thread); 参数:要杀死线程线程 ID 返回值:函数调用成功返回 0,调用失败返回非 0 错误号。

3.3K30

程序一定要从main函数开始运行吗?

链接器扫描完所有的输入目标文件后,所有这种未定义符号都应该能在全局符号表中找到,否则报符号未定义错误。...编译编译选项是: -ffunction-sections -fdata-sections 可能很多人都会以为程序都是由main函数开始执行和结束,但其实不是,main函数调用之前,为了保证程序可以顺利进行...Linux一般程序入口是__start函数,程序有两个相关段: init段:进程初始化代码,一个程序开始运行时,main函数调用之前,会先运行.init段代码。...fini段:进程终止代码,当main函数正常退出后,glibc会安排执行该段代码。...I:该符号另一个符号间接引用 N:debug符号 R:该符号位于只读数据区 T:该符号位于代码段 U:该符号在当前文件未定义,定义别的文件 ?

1.2K30

Linux多线程编程实例解析

另外,因为pthread库不是linux系统库,所以进行编译时候要加上-lpthread,否则编译不过,会出现下面错误 thread_test.c: 函数 ‘create’ : thread_test.c...:7: 警告: 在有返回函数,程序流程到达函数尾 /tmp/ccOBJmuD.o: In function `main':thread_test.c:(.text+0x4f):‘pthread_create...’未定义引用 collect2: ld 返回 1 此例子介绍了创建线程方法 下面例子介绍向线程传递参数。...fs@ubuntu:~/qiang/thread$ 例程总结:     可以看出来,我们main函数传递整行指针,传递到我们新建线程函数。...线程正常退出方式: (1) 线程只是从启动例程返回返回值是线程退出码 (2) 线程可以被另一个进程进行终止 (3) 线程自己调用pthread_exit函数 两个重要函数原型: include

2K20

GCC 编译使用

日常交流通常使用“编译”统称这 4 个步骤,如果不是特指这 4 个步骤某一个,本教程也依惯例使用“编译”这个统称。...(4)链接 链接就是将上步生成 OBJ 文件和系统库 OBJ 文件、库文件链接起来,最终生成了可以特定平台运行可执行文件,用到工具为 ldcollect2。...+编译、汇编和链接,ldcollect2 调用来链接程序。...不使用-O'或-O1’选项目的是减少编译开销,使编译结果能够调试、语句是独立:如果在两条语句之间用断点中止程序,可以对任何变量重新赋值,或者函数体内把程序计数器指到其他语句,以及从源程序精确地获取你所期待结果...: : undefined reference to `printf' collect2: ld returned 1 exit status 出现了一大堆错误,因为 printf 等函数是在库文件实现

3.8K31

c语言中static关键字用法详解

静态局部变量使用static修饰符定义,即使声明时未赋初值,编译器也会把它初始化为0。且静态局部变量存储于进程全局数据区,即使函数返回,它值也会保持不变。...函数 函数使用方式与全局变量类似,函数返回类型前加上static,就是静态函数。...其特性如下: 静态函数只能在声明它文件可见,其他文件不能引用函数 不同文件可以使用相同名字静态函数,互不影响 非静态函数可以另一个文件中直接引用,甚至不必使用extern声明 下面两个文件例子说明使用...\n"); } 使用 gcc file1.c file2.c编译时,错误报告如下: /tmp/cc2VMzGR.o:函数main: static_fun.c:(.text+0x20):‘fun1...’未定义引用 collect2: error: ld returned 1 exit status 修改文件,不使用static修饰符,可在另一文件引用函数: /* file1.c */ #include

52120

编译make出错提示解决方案

编译出错笔记: start.s:20: Error: no such instruction: `ldr r0,=WTCON' 错误:没有这样指令 解决:编译文件后缀名必须为大写S,改为start.S...r0,#0 start.o(.text+0xc8): In function `SDRAM_CONFIG': : undefined reference to `lr' 错误:start.SLR...未定义引用 解决:start.S中找到 ldr pc,=lr ,编译器误解lr是一个变量,这里应该写成mov pc,lr(完成一个子程序返回) 12: error: syntax error..."include" 错误:“include”标号之前有语法错误 74: warning: return type of 'main' is not `int' 错误:main函数返回值不是int..._init' 错误:74行中用到uart0_init函数只是隐形声明(implicit declaration),在这个文件没有extern声明或者调用头文件 解决:1.本文开头上添加:

1.6K100

认识目标文件符号

其实这些符号是被定义 ld 链接器链接脚本,我们无须定义它们,但可以声明它们并使用。...目前我们所看到对外部目标文件符号引用在目标文件被最终链接成可执行文件时,它们须要被正确决议,如果没有找到该符号定义,链接器就会报符号未定义错误,这种被称为强引用(Strong Reference)...链接器处理强引用和弱引用过程几乎一样,只是对于未定义引用,链接器不认为它是一个错误。一般对于未定义引用,链接器默认其为0,或者是一个特殊值,以便于程序代码能够识别。...GCC,我们可以通过使用 __attribute__((weakref)) 这个扩展关键字来声明一个外部函数引用为弱引用,比如下面这段代码: __attribute__ ((weakref))...但是当我们运行这个可执行文件时,会发生运行错误。因为当main函数试图调用foo函数时,foo函数地址为0,于是发生了非法地址访问错误

1.5K40

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

实际编译代码过程,我们经常会遇到"undefined reference to"问题,简单可以轻易地解决,但有些却隐藏得很深,需要花费大量时间去排查。...code 1 (use -v to see invocation) 编译时报错了,这是最典型undefined reference错误,因为链接时发现找不到某个函数实现文件。...先更改一下第一个示例中使用到代码,test()调用其它函数,更改代码如下所示。...test.c:(.text+0x13): undefined reference to `func' collect2: ld returned 1 exit status 因此,链接命令给出所依赖库时...c++代码链接c语言库 代码同示例一代码一样,只是把main.c更改成了main.cpp。编译test.c,并打包为静态库。

6.8K31
领券