OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4929|回复: 16

我想改一个C++版的stm32 ucos-II,工程修改的时候出现链接错误,请问谁能帮我解答这个问题

[复制链接]

2

主题

11

帖子

0

精华

初级会员

Rank: 2

积分
52
金钱
52
注册时间
2011-3-12
在线时间
4 小时
发表于 2015-6-10 15:02:40 | 显示全部楼层 |阅读模式
5金钱

linking...
.\Obj\output.axf: Error: L6218E: Undefined symbol OSTaskCreateExt (referred from app.o).
.\Obj\output.axf: Error: L6218E: Undefined symbol OSTaskStkInit (referred from os_task.o).
Target not created


我在os_cfg.h中 修改了宏定义  由0改为了1,为什么还是会出现第一条错误,请大侠帮 看一下

#define OS_TASK_CREATE_EXT_EN     1    /*     Include code for OSTaskCreateExt()         

最佳答案

查看完整内容[请看2#楼]

回复【10楼】caisx8411: --------------------------------- 我倒是找到了解决方式,在ucos_ii.h里把这两个函数的声明拿出来放在 extern"c"{ } 这个框子外面就可以了,从结果看表面这两个函数是C++函数,所以不能进行C转化的 但原理我也不懂为什么
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

3

主题

401

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1769
金钱
1769
注册时间
2015-6-11
在线时间
313 小时
发表于 2015-6-10 15:02:41 | 显示全部楼层
回复【10楼】caisx8411:
---------------------------------
我倒是找到了解决方式,在ucos_ii.h里把这两个函数的声明拿出来放在
extern"c"{
}
这个框子外面就可以了,从结果看表面这两个函数是C++函数,所以不能进行C转化的
但原理我也不懂为什么
回复

使用道具 举报

2

主题

11

帖子

0

精华

初级会员

Rank: 2

积分
52
金钱
52
注册时间
2011-3-12
在线时间
4 小时
 楼主| 发表于 2015-6-10 15:42:00 | 显示全部楼层
自己先顶一下
回复

使用道具 举报

2

主题

11

帖子

0

精华

初级会员

Rank: 2

积分
52
金钱
52
注册时间
2011-3-12
在线时间
4 小时
 楼主| 发表于 2015-6-10 17:04:58 | 显示全部楼层

还是刚才这个问题,现在我把工程文件上传上来,有兴趣的大侠帮我看一下,我是从C版本改到C++版本的,改之前的C版,编译链接都没有问题,我只是将   .c文件相应的改成了  .CPP文件,然后在cpu.h,文件中头和尾添加了

#ifdef __cplusplus
extern "C" {
#endif



#ifdef __cplusplus
}
#endif

然后编译链接剩下两个错误

linking...

.\Obj\output.axf: Error: L6218E: Undefined symbol OSTaskCreateExt (referred from app.o).
.\Obj\output.axf: Error: L6218E: Undefined symbol OSTaskStkInit (referred from os_task.o).
Target not created

这两个错误困扰我有一段时间了,请各位帮忙看看

Ex300_uCOS-II_(NACP_ucos_cppp).rar

5.62 MB, 下载次数: 63

回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2015-6-11 00:53:11 | 显示全部楼层
回复【3楼】caisx8411:
---------------------------------
说明这两个函数没定义,你找找看这两个函数在哪里?
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

2

主题

11

帖子

0

精华

初级会员

Rank: 2

积分
52
金钱
52
注册时间
2011-3-12
在线时间
4 小时
 楼主| 发表于 2015-6-11 09:54:46 | 显示全部楼层
回复【4楼】正点原子:
---------------------------------
这两个函数是UCOS-II操作系统自带的函数
OSTaskCreateExt在os_task.cpp中定义,是在ucos_ii.h中声明的
OSTaskStkInit在os_cpu_c.cpp中定义,也是在ucos_ii.h中声明的
不知道为什么链接会出现错误
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2015-6-11 21:50:40 | 显示全部楼层
回复【5楼】caisx8411:
---------------------------------
这两个.cpp没加进来吧,呵呵
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

2

主题

11

帖子

0

精华

初级会员

Rank: 2

积分
52
金钱
52
注册时间
2011-3-12
在线时间
4 小时
 楼主| 发表于 2015-6-11 22:05:09 | 显示全部楼层

加进来了

回复

使用道具 举报

2

主题

11

帖子

0

精华

初级会员

Rank: 2

积分
52
金钱
52
注册时间
2011-3-12
在线时间
4 小时
 楼主| 发表于 2015-6-11 22:06:17 | 显示全部楼层

加进来了

回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2015-6-11 22:08:10 | 显示全部楼层
回复【8楼】caisx8411:
---------------------------------
那应该能找到才对。
实在不行,用绝招:
extern 声明一下
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

2

主题

11

帖子

0

精华

初级会员

Rank: 2

积分
52
金钱
52
注册时间
2011-3-12
在线时间
4 小时
 楼主| 发表于 2015-6-12 10:33:07 | 显示全部楼层
回复【9楼】正点原子:
---------------------------------
试过了,还是不行啊,郁闷啊
回复

使用道具 举报

2

主题

11

帖子

0

精华

初级会员

Rank: 2

积分
52
金钱
52
注册时间
2011-3-12
在线时间
4 小时
 楼主| 发表于 2015-6-12 18:03:10 | 显示全部楼层
回复【11楼】zc123:
---------------------------------
这样试过了,也不行,真是没招了
回复

使用道具 举报

3

主题

401

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1769
金钱
1769
注册时间
2015-6-11
在线时间
313 小时
发表于 2015-6-12 18:08:38 | 显示全部楼层
我这可以的啊



不过我是把函数放在ucos-ii这个位置的:

回复

使用道具 举报

2

主题

11

帖子

0

精华

初级会员

Rank: 2

积分
52
金钱
52
注册时间
2011-3-12
在线时间
4 小时
 楼主| 发表于 2015-6-12 18:54:00 | 显示全部楼层
回复【13楼】zc123:
---------------------------------
真是太感谢你了,按照你的方法问题解决了,你能解释一下为什么放在
#ifdef __cplusplus
extern "C" {
#endif


#ifdef __cplusplus
}
#endif
结构的外面来声明OSTaskCreateExt和OSTaskStkInit这两个函数,链接的时候就不会报错了吗?
回复

使用道具 举报

3

主题

401

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1769
金钱
1769
注册时间
2015-6-11
在线时间
313 小时
发表于 2015-6-12 21:06:02 | 显示全部楼层
回复【14楼】caisx8411:
---------------------------------
具体我也搞不清楚,但大概是这样
OSTaskCreateExt和OSTaskStkInit是定义在cpp文件中的,所以在中间变量.o中链接成支持重载的类型,所以就被链接成
_OSTaskCreateExt_void_void_...._short这样的,
如果你定义在extern "C"中, 头文件的声明对应的就是_OSTaskCreateExt, 所以找不到,这是从结果推理的
但如果成立的话,为什么外设库.cpp文件中函数又可以链接上,这是我奇怪的
回复

使用道具 举报

3

主题

401

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1769
金钱
1769
注册时间
2015-6-11
在线时间
313 小时
发表于 2015-6-12 22:45:28 | 显示全部楼层
我测试了下,到是找到问题的所在了,代码在下面
首先C-asm-import就是你出错的那种情况,首先确定一点__cplusplus宏定义在C++调用时是一定起作用的
也就是看MDK对extern "C"中函数声明对链接的处理
1.从测试上看,如果函数没有被汇编调用,那么声明链接生成的中间代码就是对的
  也就是在.c和.asm文件内函数声明被链接成不带参数的,.cpp文件链接成带参数的
2.如果.h中的声明被汇编调用的话,那么整个.h文件extern "C"中的函数声明就全部被链接成不带参数的,也就是不会直接查询该函数是在什么文件内定义的,再进行编译链接,这应该是MDK链接机制的问题,MDK是机智的,但看来还没有足够机智

test.rar

211.27 KB, 下载次数: 87

回复

使用道具 举报

2

主题

6

帖子

0

精华

新手上路

积分
35
金钱
35
注册时间
2014-4-21
在线时间
0 小时
发表于 2016-3-29 09:51:22 | 显示全部楼层
同样遇到这个问题,mark。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-19 22:17

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表