当前位置: 技术问答>linux和unix
apue例子编译的问题
来源: 互联网 发布时间:2017-05-23
本文导语: 按照网上的方法编译出了libapue.a,但还是出现链接错误 $ gcc fig1.3.cpp -lapue /tmp/ccswK9BA.o: In function `main': fig1.3.cpp:(.text+0x20): undefined reference to `err_quit(char const*, ...)' fig1.3.cpp:(.text+0x60): undefined reference to `err_sys(c...
按照网上的方法编译出了libapue.a,但还是出现链接错误
$ gcc fig1.3.cpp -lapue
/tmp/ccswK9BA.o: In function `main':
fig1.3.cpp:(.text+0x20): undefined reference to `err_quit(char const*, ...)'
fig1.3.cpp:(.text+0x60): undefined reference to `err_sys(char const*, ...)'
collect2: error: ld returned 1 exit status
对libapue.a 使用 nm 查看结果,里面应该有这两个函数的哇,请问是什么原因导致链接错误的,怎么解决
error.o:
U abort
0000000000000413 t err_doit
0000000000000209 T err_dump
000000000000015a T err_exit
00000000000002b5 T err_msg
U __errno_location
0000000000000360 T err_quit
0000000000000000 T err_ret
00000000000000a9 T err_sys
$ gcc fig1.3.cpp -lapue
/tmp/ccswK9BA.o: In function `main':
fig1.3.cpp:(.text+0x20): undefined reference to `err_quit(char const*, ...)'
fig1.3.cpp:(.text+0x60): undefined reference to `err_sys(char const*, ...)'
collect2: error: ld returned 1 exit status
对libapue.a 使用 nm 查看结果,里面应该有这两个函数的哇,请问是什么原因导致链接错误的,怎么解决
error.o:
U abort
0000000000000413 t err_doit
0000000000000209 T err_dump
000000000000015a T err_exit
00000000000002b5 T err_msg
U __errno_location
0000000000000360 T err_quit
0000000000000000 T err_ret
00000000000000a9 T err_sys
|
因为你的文件后缀是cpp,gcc当作C++文件并自动调用g++去编译,由于C++ name mangle 机制,函数名被修改了。你可以用先把cpp文件编译成.o文件(用-c),再用nm看看就能发现函数名被修改了。具体可以google C++ mangle。
简单的解决方法就是把文件名从.cpp改成.c。
另一种方法就是用extern C防止mangle。
简单的解决方法就是把文件名从.cpp改成.c。
另一种方法就是用extern C防止mangle。