由编译错误看-L. -lxxxx的正确位置
2012-07-31 14:52
337 查看
问题:
在研究一个问题时,碰到了新的问题。知道了-L. -lmyhello的正确放置位置。
要研究的问题是:除了-static参数之外,使用静态库和使用动态库编译成目标程序使用的gcc命令完全一样,那当动态库和静态库同名时,gcc命令会优先使用哪个库?
研究的范围在lib_test目录下有如下的文件:
解决办法:
1. 单条执行命令:
只编译不链接。
生成静态库。
都能成功运行,得到所需要的文件。
后来,为了编译方便,添加了Makefile文件,其中,将生成目标程序hello的执行过程写为:
在make的时候总是出错,错误信息如下:
2. 经反复对比发现,原来单条命令执行的时候,命令为:
确实出现了错误信息。
这说明,确实是-L. -lmyhello的位置导致了编译错误的出现。
所以,库文件最好放在编译链接命令的最后端,不是放在目标程序的前面,而是在目标程序的后面。
在研究一个问题时,碰到了新的问题。知道了-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的位置导致了编译错误的出现。
所以,库文件最好放在编译链接命令的最后端,不是放在目标程序的前面,而是在目标程序的后面。
相关文章推荐
- 由编译错误看-L. -lxxxx的正确位置
- Ajax代码正确却出现“XML解析错误:未找到元素 位置:moz-nullprincipal”错误
- Qt5 : 使用QtDesigner的时候查看代码正确 但是编译的时候总出现 为定义的错误
- Java源文件编译出错:类文件包含错误的类 请删除该文件或确保文件位于正确的类路径子目录中
- iOS:编译错误Local declaration of ‘XXXX' hides instance variable
- 【转】正确理解PHP程序编译时的错误信息
- DW中出现 "以下翻译器没有被装载,由于错误:xxxx.htm:有不正确的设置信息" 问题的解决方案
- vs2008编译 error PRJ0019: 某个工具从以下位置返回了错误代码: "执行注册"
- Android JNI 编译正确 但是提示程序有错误无法运行 而且还看不到任何错误提示 的解决方法
- 正确和错误只差一个括号的位置
- 正确理解PHP程序编译时的错误信息
- Dreamweaver中出现 "以下翻译器没有被装载,由于错误:xxxx.htm:有不正确的设置信息" 问题的解决方案(8,cs3,cs4似乎都会出现改问题)
- 未预编译文件“/xxxx/aaa.aspx”,因此不能请求该文件错误
- 编译错误:XXX.axf: Error: L6218E: Undefined symbol xxx (referred from xxxx.o).
- 看起来正确的代码也会隐藏着格式错误导致编译错误
- Visual Studio 2005 编译的版本无法启动,出现应用程序配置不正确的错误
- c++ clr编译dll在c#调用时出现“试图加载不正确的格式”“找不到dll”错误的解决
- xcode 的编译时提醒报错,但却没有提示错误的位置
- 结构体的定义位置不正确导致的错误
- 解决android混淆编译出现Proguard returned with error code 1和文件名、目录名或卷标语法不正确错误