linux下如何手动链接C++程序?

calories 2006-11-22 07:34:54
在RedHat Linux 9下,编译链接C++程序时,可直接使用:
g++ test.cpp -o test.out

现在想把编译和链接分开来做:
g++ -c test.cpp

生成了test.o,然后使用:

ld test.o -o test2.out

结果出现了一大堆undefined reference错误,原因是没有链接上相应的C++库
于是查了 ldd test.out,发现需要下面的库:
libstdc++.so.5 => /usr/lib/libstdc++.so.5 (0x40034000)
libm.so.6 => /lib/tls/libm.so.6 (0x400e7000)
libgcc_s.so.1 => /lib/libgcc_s.so.1 (0x40109000)
libc.so.6 => /lib/tls/libc.so.6 (0x42000000)
/lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x40000000)

这些库应该怎么才能手动链接上呢?试了好多次都没有成功。请大家指教,谢谢!


...全文
3117 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
wqvbka123 2006-11-26
  • 打赏
  • 举报
回复
Ok
cnwolf 2006-11-26
  • 打赏
  • 举报
回复
以前想使用ld 连接gcc 编译的.o成为可执行程序,也没有成功

想知道使用ld连接可执行程序有没有特定的参数

连接动态库是可以的
pacman2000 2006-11-25
  • 打赏
  • 举报
回复
把-L的路径写在-l的前面再试试。
lxzhou 2006-11-25
  • 打赏
  • 举报
回复
我刚接触linux, 看不懂的....学习.....
neustrong 2006-11-24
  • 打赏
  • 举报
回复
mark..
calories 2006-11-24
  • 打赏
  • 举报
回复
to wqf363(denny):

是说-L路径名吧,我查了一下,stdc++库应该在/usr/lib下,于是这样:
ld test.o -o test2.out -lstdc++ -L/usr/lib

可还是提示说:
ld: cannot find -lstdc++
zhugcx 2006-11-24
  • 打赏
  • 举报
回复
动态连接在C++下不是使用动代库吗??编译时不是这样吗??g++ get.cpp -shared -o libggg.so 连接可执行文件的使用使用 -L路径 -lggg ,,运行的时候可以使用LD_LIBRARY_PATH这个环境变量来指定动态库的路径,,当然还有其他方法了,,,

试试吧,,不行就查查书,,至少linux是这样di
mathe 2006-11-24
  • 打赏
  • 举报
回复

g++ -v test.cpp
命令查看g++到底用什么来做的链接,链接了什么文件
c++文件还是比较复杂的,在我的机器上,是

/usr/lib/gcc-lib/i386-redhat-linux/3.2.3/collect2 --eh-frame-hdr -m elf_i386 -dynamic-linker /lib/ld-linux.so.2 /usr/lib/gcc-lib/i386-redhat-linux/3.2.3/../../../crt1.o /usr/lib/gcc-lib/i386-redhat-linux/3.2.3/../../../crti.o /usr/lib/gcc-lib/i386-redhat-linux/3.2.3/crtbegin.o -L/usr/lib/gcc-lib/i386-redhat-linux/3.2.3 -L/usr/lib/gcc-lib/i386-redhat-linux/3.2.3/../../.. /tmp/ccGaSssM.o -lstdc++ -lm -lgcc_s -lgcc -lc -lgcc_s -lgcc /usr/lib/gcc-lib/i386-redhat-linux/3.2.3/crtend.o /usr/lib/gcc-lib/i386-redhat-linux/3.2.3/../../../crtn.o
calories 2006-11-24
  • 打赏
  • 举报
回复
to wzzww(无知者无畏)
多谢啊!
无知者无谓 2006-11-24
  • 打赏
  • 举报
回复
上面已经说了-L指定目录,记得不错的话应该还有一层目标吧?不是/usr/lib
现在工作环境是Win没法给你试,不好意思。昨天想当然以为解决了,回去没试一下,今晚回去试一下再说吧
HoBoss 2006-11-23
  • 打赏
  • 举报
回复
http://community.csdn.net/Expert/topic/5173/5173006.xml?temp=.1417353

编译可以用gcc/g++,而链接可以用g++或者gcc -lstdc++。因为gcc命令不能自动和C++程序使用的库联接,所以通常使用g++来完成联接。

m2213231() ( ) 信誉:100 Blog 2006-11-22 19:54:57 得分: 0


顶楼上的,补充一下,如果使用gcc编译.cpp的文件的话还应该加上"-x c++"
Ex: "gcc -x c++ -o test.cpp test.exe -lstdc++"


无知者无谓 2006-11-23
  • 打赏
  • 举报
回复
g++ -o test2.out test.o
仰望星空WU 2006-11-23
  • 打赏
  • 举报
回复
ld test.o -o test2.out -lstdc++
没找到路径, 再加-I路径名
calories 2006-11-23
  • 打赏
  • 举报
回复
使用:
ld test.o -o test2.out -lstdc++
输出结果:
ld: cannot find -lstdc++

可是使用g++ -o test2.out test.o就没有问题

为什么使用ld就找不到stdc++库呢?
无知者无谓 2006-11-23
  • 打赏
  • 举报
回复
ld test.o -o test2.out -lstdc++

你man ld看看嘛,里面有相关信息
calories 2006-11-23
  • 打赏
  • 举报
回复
谢谢楼上的两位,我知道用g++或gcc可以编译链接成功。现在就想自己试一下手动用ld来做链接,请问可以成功么?

23,222

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧