明远智睿技术论坛

 找回密码
 立即注册
搜索
查看: 6292|回复: 8
打印 上一主题 下一主题

linux应用程序编译出错的疑问。

[复制链接]

3

主题

10

帖子

53

积分

注册会员

Rank: 2

积分
53
跳转到指定楼层
楼主
发表于 2018-1-29 14:45:19 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我有一个简单的应用程序,用虚拟机X86下的GCC编译、连接通过。改Makefile,将CC和LD改为imx6ul的交叉编译工具,编译可以通过,但连接时错误如下:
/opt/imx6-linux/gcc-linaro-arm-linux-gnueabihf-4.9-2014.09_linux/arm-linux-gnueabihf/bin/ld: gsm0710.o: undefined reference to symbol 'exit@@GLIBC_2.4'
/opt/imx6-linux/gcc-linaro-arm-linux-gnueabihf-4.9-2014.09_linux/arm-linux-gnueabihf/bin/../libc/lib/arm-linux-gnueabihf/libc.so.6: error adding symbols: DSO missing from command line
make: *** [gsmMuxd] 错误 1

Makefile 增加了-L将交叉工具链的lib目录引入。如下:
CC = /opt/imx6-linux/gcc-linaro-arm-linux-gnueabihf-4.9-2014.09_linux/bin/arm-linux-gnueabihf-gcc
LD = /opt/imx6-linux/gcc-linaro-arm-linux-gnueabihf-4.9-2014.09_linux/bin/arm-linux-gnueabihf-ld
#CC = gcc
#LD = ld
CFLAGS = -Wall
LDLIBS = -L /opt/imx6-linux/gcc-linaro-arm-linux-gnueabihf-4.9-2014.09_linux/arm-linux-gnueabihf/libc/lib/arm-linux-gnueabihf -lm
#LDLIBS = -lm
通常都是Makefile增加-L导入库目录即可,或者是-l引入相关的库,不知道这个exit为C标准库函数怎么无法找到?

回复

使用道具 举报

3

主题

10

帖子

53

积分

注册会员

Rank: 2

积分
53
沙发
 楼主| 发表于 2018-1-30 12:08:53 | 只看该作者
这个支持太蜗牛了。。。。
回复 支持 反对

使用道具 举报

36

主题

745

帖子

2872

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
2872
板凳
发表于 2018-2-1 16:29:48 | 只看该作者
一般简单设置交叉编译工具的环境变量就行的,我们提供的测试源码能编译吗
回复 支持 反对

使用道具 举报

3

主题

10

帖子

53

积分

注册会员

Rank: 2

积分
53
地板
 楼主| 发表于 2018-2-2 15:46:57 | 只看该作者
软件01 发表于 2018-2-1 16:29
一般简单设置交叉编译工具的环境变量就行的,我们提供的测试源码能编译吗 ...

示例可以,但有个GPRS-MUX串口服用的程序不行。。
回复 支持 反对

使用道具 举报

3

主题

10

帖子

53

积分

注册会员

Rank: 2

积分
53
5#
 楼主| 发表于 2018-2-2 15:49:31 | 只看该作者
ifeq ($(DEBUG),y)
  CFLAGS += -DDEBUG
endif


all: $(TARGET)

clean:
        rm -f $(OBJS) $(TARGET)

%.o: %.c
        $(CC) $(CFLAGS) -c -o $@ $<

$(TARGET): $(OBJS)
        $(LD) $(LDLIBS) -o $@ $(OBJS)

.PHONY: all clean

最后一步LD时出错。
回复 支持 反对

使用道具 举报

36

主题

745

帖子

2872

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
2872
6#
发表于 2018-2-3 13:34:27 | 只看该作者
neverstopping 发表于 2018-2-2 15:49
ifeq ($(DEBUG),y)
  CFLAGS += -DDEBUG
endif

那是你Makefile应该有问题啊,我也编译过GPS的串口测试程序,没问题啊,但是Makefile跟你的写法不一样的;
你尝试用ubuntu里面的GCC能编译OK啊
回复 支持 反对

使用道具 举报

3

主题

10

帖子

53

积分

注册会员

Rank: 2

积分
53
7#
 楼主| 发表于 2018-2-5 10:29:51 | 只看该作者
本帖最后由 neverstopping 于 2018-2-5 10:34 编辑
软件01 发表于 2018-2-3 13:34
那是你Makefile应该有问题啊,我也编译过GPS的串口测试程序,没问题啊,但是Makefile跟你的写法不一样的 ...

Make 将CC 和LD 更改为X86-32下的gcc 可以连接目标可执行文件,但用iMX6的交叉编译工具连接时出错
回复 支持 反对

使用道具 举报

3

主题

10

帖子

53

积分

注册会员

Rank: 2

积分
53
8#
 楼主| 发表于 2018-3-6 10:14:17 | 只看该作者
应用相当简单,就2个.c文件和2个.h文件,用x86的gcc可以编译出目标程序,但改为交叉编译工具就不行,下面是Makefile:

DEBUG = y

TARGET = gsmMuxd
SRC = gsm0710.c buffer.c
OBJS = gsm0710.o buffer.o

CC = /opt/imx6-linux/gcc-linaro-arm-linux-gnueabihf-4.9-2014.09_linux/bin/arm-linux-gnueabihf-gcc
LD = /opt/imx6-linux/gcc-linaro-arm-linux-gnueabihf-4.9-2014.09_linux/bin/arm-linux-gnueabihf-ld
#CC = gcc
#LD = gcc
CFLAGS = -Wall
LDLIBS = -lm

ifeq ($(DEBUG),y)
  CFLAGS += -DDEBUG
endif


all: $(TARGET)

clean:
        rm -f $(OBJS) $(TARGET)

%.o: %.c
        $(CC) $(CFLAGS) -c -o $@ $<

$(TARGET): $(OBJS)
        $(LD) $(LDLIBS) -o $@ $(OBJS)

.PHONY: all clean
回复 支持 反对

使用道具 举报

0

主题

146

帖子

432

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
432
9#
发表于 2018-3-28 09:31:21 | 只看该作者
首先,x86 能编译不能说明源文件没有问题,但是如果 x86 都不能编译那基本可以说明源文件有问题。
第二,你不用makefile,直接用 gcc-linaro-arm-linux-gnueabihf-4.9-2014.09_linux/bin/arm-linux-gnueabihf-gcc 编译。如果不能编译,就是源文件或环境有问题。如果能编译就是Makefile有问题。
回复 支持 反对

使用道具 举报

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

本版积分规则

Archiver|手机版|小黑屋|明远智睿  

GMT+8, 2024-11-23 07:29 , Processed in 0.064571 second(s), 21 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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