当前时区为 UTC + 8 小时



发表新帖 回复这个主题  [ 3 篇帖子 ] 
作者 内容
1 楼 
 文章标题 : 程序报告“段错误”然后退出的一种原因
帖子发表于 : 2009-05-27 23:29 

注册: 2009-05-13 12:55
帖子: 18
送出感谢: 0 次
接收感谢: 0 次
编译可执行程序启用了 -shared 选项,则运行时出现“段错误”!

今天我编译 boost::asio 例子程序 blocking_tcp_echo_server,编译链接都很正常,但是执行的时候报告“段错误”然后退出,经过一番研究发现,原来是因为我使用了 -shared 链接选项! 看 Makefile:
代码:
%CC = g++
CFLAGS += -I/usr/local/include/boost-1_39
LDFLAGS += -shared
LIBS += -lboost_system-gcc43-mt -lboost_thread-gcc43-mt

PROJ = blocking_tcp_echo_server
OBJS = blocking_tcp_echo_server.o

all: $(PROJ)
$(PROJ): $(OBJS)
   $(CC) $(LDFLAGS) -o $(PROJ) $(OBJS) $(LIBS)

blocking_tcp_echo_server.o: blocking_tcp_echo_server.cpp
   $(CC) $(CFLAGS) -c blocking_tcp_echo_server.cpp

clean:
   -rm -f $(PROJ) *.o

把 “-shared” 去掉就好了:
代码:
LDFLAGS += -shared

此案引发了我的疑惑:
  • 既然不能用 -shared 链接可执行程序,为何 gcc 不报错?
  • 或者,更进一步,链接可执行程序时何不忽略 -shared 选项?


页首
 用户资料  
 
2 楼 
 文章标题 : Re: 程序报告“段错误”然后退出的一种原因
帖子发表于 : 2009-05-27 23:51 

注册: 2006-09-11 22:47
帖子: 2841
送出感谢: 0 次
接收感谢: 4
使用 -shared 编译出来的就是动态连接库,不是执行程序。

你把动态连接库直接拿去执行,当然报错。

gcc并没有义务禁止编译动态连接库啊。

至于你说的“连接可执行程序为什么不忽略-shared”,问题是你并没有告诉gcc你要连接可执行程序啊。


页首
 用户资料  
 
3 楼 
 文章标题 : Re: 程序报告“段错误”然后退出的一种原因
帖子发表于 : 2009-05-28 14:29 

注册: 2009-05-13 12:55
帖子: 18
送出感谢: 0 次
接收感谢: 0 次
poet 写道:
使用 -shared 编译出来的就是动态连接库,不是执行程序。

你把动态连接库直接拿去执行,当然报错。

gcc并没有义务禁止编译动态连接库啊。

至于你说的“连接可执行程序为什么不忽略-shared”,问题是你并没有告诉gcc你要连接可执行程序啊。

你说的对,是我错怪 gcc 了。


页首
 用户资料  
 
显示帖子 :  排序  
发表新帖 回复这个主题  [ 3 篇帖子 ] 

当前时区为 UTC + 8 小时


在线用户

正在浏览此版面的用户:没有注册用户 和 2 位游客


不能 在这个版面发表主题
不能 在这个版面回复主题
不能 在这个版面编辑帖子
不能 在这个版面删除帖子
不能 在这个版面提交附件

前往 :  
本站点为公益性站点,用于推广开源自由软件,由 DiaHosting VPSBudgetVM VPS 提供服务。
我们认为:软件应可免费取得,软件工具在各种语言环境下皆可使用,且不会有任何功能上的差异;
人们应有定制和修改软件的自由,且方式不受限制,只要他们自认为合适。

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
简体中文语系由 王笑宇 翻译