• 由编译错误看L. lxxxx的正确位置


    问题:

    在研究一个问题时,碰到了新的问题。知道了-L. -lmyhello的正确放置位置。

    要研究的问题是:除了-static参数之外,使用静态库和使用动态库编译成目标程序使用的gcc命令完全一样,那当动态库和静态库同名时,gcc命令会优先使用哪个库?

    研究的范围在lib_test目录下有如下的文件:

    dingq@wd-u1110:~/wrk/tmp/lib_test$ ll
    total 16
    -rw-rw-r-- 1 dingq dingq 518 2012-07-31 10:17 hello.c
    -rw-rw-r-- 1 dingq dingq 519 2012-07-31 10:22 hello.h
    -rw-rw-r-- 1 dingq dingq 501 2012-07-31 13:51 main.c
    -rw-rw-r-- 1 dingq dingq 542 2012-07-31 14:07 Makefile

    解决办法:

    1. 单条执行命令:

    gcc -g3 -Wall -o0 -c hello.c -o hello.o

    只编译不链接。

    ar cr libmyhello.a hello.o

    生成静态库。

    gcc -fPIC -shared -o libmyhello.so hello.o
    生成动态库。

    gcc -o hello main.c -L. -lmyhello
    生成目标程序hello。

    都能成功运行,得到所需要的文件。

    后来,为了编译方便,添加了Makefile文件,其中,将生成目标程序hello的执行过程写为:

    hello : $(OBJS)
    	$(CC) $(LDFLAGS) -o hello main.c
    前面的变量设定为:

    CROSS_COMPILE =
    PREFIX = $(CROSS_COMPILE)
    CC = $(PREFIX)gcc
    
    CCFLAGS = -g3 -Wall -o0
    LD = $(CC)
    LDFLAGS = -L. -lmyhello
    AR = $(PREFIX)ar
    ARFLAGS = cr
    
    RM = -rm -f
    
    SRCS = hello.c
    OBJS = $(SRCS:%.c=%.o)
    
    .PHONY : all
    all: lib_a lib_so hello
    
    %.o : %.c
    	$(CC) $(CCFLAGS) -c $< -o $@
    

    在make的时候总是出错,错误信息如下:

    /tmp/ccgznsuX.o: In function `main':
    main.c:(.text+0x11): undefined reference to `hello'
    collect2: ld returned 1 exit status
    但是,单条命令执行的时候又是对的。
    2. 经反复对比发现,原来单条命令执行的时候,命令为:

    gcc -o hello main.c -L. -lmyhello
    而在Makefile中,命令则改为:

    gcc -L. -lmyhello -o hello main.c
    为了验证确实是-L. -lmyhello的位置导致了编译出现错误,单独在命令行中执行命令:

    gcc -L. -lmyhello -o hello main.c

    确实出现了错误信息。

    这说明,确实是-L. -lmyhello的位置导致了编译错误的出现。


    所以,库文件最好放在编译链接命令的最后端,不是放在目标程序的前面,而是在目标程序的后面。



  • 相关阅读:
    vue使用axios调用api接口
    vue引用echarts
    C# 倒计时,显示天,时,分,秒。时间可以是从数据库捞出来
    DataGridView 控件操作大全 (内容居中显示,右键绑定菜单)
    Oracle使用row_number()函数查询时增加序号列
    Oracle 相关操作SQL
    oracle rac切换到单实例DG后OGG的处理
    oracle dg库因为standby_file_management参数导致应用停止
    oracle rac与单实例DG切换
    oracle rac搭建单实例DG步骤(阅读全篇后再做)
  • 原文地址:https://www.cnblogs.com/java20130726/p/3218545.html
Copyright © 2020-2023  润新知