明远智睿技术论坛

标题: linux应用程序编译出错的疑问。 [打印本页]

作者: neverstopping    时间: 2018-1-29 14:45
标题: linux应用程序编译出错的疑问。
我有一个简单的应用程序,用虚拟机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标准库函数怎么无法找到?


作者: neverstopping    时间: 2018-1-30 12:08
这个支持太蜗牛了。。。。
作者: 软件01    时间: 2018-2-1 16:29
一般简单设置交叉编译工具的环境变量就行的,我们提供的测试源码能编译吗
作者: neverstopping    时间: 2018-2-2 15:46
软件01 发表于 2018-2-1 16:29
一般简单设置交叉编译工具的环境变量就行的,我们提供的测试源码能编译吗 ...

示例可以,但有个GPRS-MUX串口服用的程序不行。。
作者: neverstopping    时间: 2018-2-2 15:49
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时出错。
作者: 软件01    时间: 2018-2-3 13:34
neverstopping 发表于 2018-2-2 15:49
ifeq ($(DEBUG),y)
  CFLAGS += -DDEBUG
endif

那是你Makefile应该有问题啊,我也编译过GPS的串口测试程序,没问题啊,但是Makefile跟你的写法不一样的;
你尝试用ubuntu里面的GCC能编译OK啊
作者: neverstopping    时间: 2018-2-5 10:29
本帖最后由 neverstopping 于 2018-2-5 10:34 编辑
软件01 发表于 2018-2-3 13:34
那是你Makefile应该有问题啊,我也编译过GPS的串口测试程序,没问题啊,但是Makefile跟你的写法不一样的 ...

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

作者: neverstopping    时间: 2018-3-6 10:14
应用相当简单,就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

作者: 唐斌    时间: 2018-3-28 09:31
首先,x86 能编译不能说明源文件没有问题,但是如果 x86 都不能编译那基本可以说明源文件有问题。
第二,你不用makefile,直接用 gcc-linaro-arm-linux-gnueabihf-4.9-2014.09_linux/bin/arm-linux-gnueabihf-gcc 编译。如果不能编译,就是源文件或环境有问题。如果能编译就是Makefile有问题。




欢迎光临 明远智睿技术论坛 (http://bbs.myzr.com.cn/) Powered by Discuz! X3.2