【发布时间】:2014-04-11 02:22:47
【问题描述】:
我的应用程序在 solaris sparc 中运行并使用 g++ 4.8.2 构建,版本详细信息是:
solaris : SunOS t1000 5.10 Generic_141444-09 sun4v sparc SUNW,Sun-Fire-T1000
g++ : gcc version 4.8.2 (GCC)
第一次,我使用 boost::thread 并通过以下方式构建应用程序:
g++ -pthreads -lsocket -lnsl -o dist/Debug/GNU-Solaris-Sparc/accagent build/Debug/GNU-Solaris-Sparc/PassengerFlowThread.o build/Debug/GNU-Solaris-Sparc/AccDataTaker.o build /Debug/GNU-Solaris-Sparc/AccCache.o build/Debug/GNU-Solaris-Sparc/Acc.o build/Debug/GNU-Solaris-Sparc/DeviceStatusThread.o build/Debug/GNU-Solaris-Sparc/EntityAccessFactory。 o build/Debug/GNU-Solaris-Sparc/BasicSmith.o build/Debug/GNU-Solaris-Sparc/CBThread.o build/Debug/GNU-Solaris-Sparc/SegmentedDeviceStatus.o build/Debug/GNU-Solaris-Sparc/ AccInfo.pb.o build/Debug/GNU-Solaris-Sparc/CBException.o build/Debug/GNU-Solaris-Sparc/TimerThread.o build/Debug/GNU-Solaris-Sparc/STEModbusRequest.o build/Debug/GNU- Solaris-Sparc/SegmentedPassengerFlow.o build/Debug/GNU-Solaris-Sparc/ModbusConfigMap.o build/Debug/GNU-Solaris-Sparc/DeviceStatusSmith.o build/Debug/GNU-Solaris-Sparc/StationModeThread.o build/Debug/ GNU-Solaris-Sparc/AccMain.o build/Debug/GNU-Solaris-Sparc/ModbusTcpServer.o build/Debug/GNU-Solaris-Sparc/Passenge rFlowSmith.o build/Debug/GNU-Solaris-Sparc/CacheKeeper.o build/Debug/GNU-Solaris-Sparc/SegmentedStationMode.o build/Debug/GNU-Solaris-Sparc/AccInfoImpl.o build/Debug/GNU-Solaris- Sparc/AsioClient.o build/Debug/GNU-Solaris-Sparc/AccDataSenderThread.o build/Debug/GNU-Solaris-Sparc/ModbusRequest.o build/Debug/GNU-Solaris-Sparc/AccDataSender.o build/Debug/GNU- Solaris-Sparc/StationModeSmith.o build/Debug/GNU-Solaris-Sparc/AccDataSenderTcpServer.o build/Debug/GNU-Solaris-Sparc/ModbusException.o build/Debug/GNU-Solaris-Sparc/CacheImpl.o build/Debug/ GNU-Solaris-Sparc/EventManagerThread.o build/Debug/GNU-Solaris-Sparc/CacheKeeperThread.o build/Debug/GNU-Solaris-Sparc/log.o build/Debug/GNU-Solaris-Sparc/AccAgent.o -L ../../../cots/poco_1_4_6/lib/SunOS/sun4v -L../../../cots/protobuf_2_4_1/src/.libs -L../../../cots/ boost_1_55_0/stage/lib -L../../../tools/lib -L../../../cots/oracle/1120/solaris10_sparc/lib -L../../../ sdk -L../../../cots/RCF_2_0_0_2670/library -lposix4 -lboost_program_options -lboost_系统 -lboost_filesystem -lboost_thread -lclntsh -lprotobuf -lRCFLibrary -lPocoNetd -lPocoUtild -lPocoFoundationd
应用运行时,通常无法创建 boost::thread。
第二次,我使用 posix 线程并构建应用程序如下:
g++ -pthreads -lsocket -lnsl -o dist/Debug/GNU-Solaris-Sparc/accagent build/Debug/GNU-Solaris-Sparc/PassengerFlowThread.o build/Debug/GNU-Solaris-Sparc/AccDataTaker.o build /Debug/GNU-Solaris-Sparc/AccCache.o build/Debug/GNU-Solaris-Sparc/Acc.o build/Debug/GNU-Solaris-Sparc/DeviceStatusThread.o build/Debug/GNU-Solaris-Sparc/EntityAccessFactory。 o build/Debug/GNU-Solaris-Sparc/BasicSmith.o build/Debug/GNU-Solaris-Sparc/CBThread.o build/Debug/GNU-Solaris-Sparc/SegmentedDeviceStatus.o build/Debug/GNU-Solaris-Sparc/ AccInfo.pb.o build/Debug/GNU-Solaris-Sparc/CBException.o build/Debug/GNU-Solaris-Sparc/TimerThread.o build/Debug/GNU-Solaris-Sparc/STEModbusRequest.o build/Debug/GNU- Solaris-Sparc/SegmentedPassengerFlow.o build/Debug/GNU-Solaris-Sparc/ModbusConfigMap.o build/Debug/GNU-Solaris-Sparc/DeviceStatusSmith.o build/Debug/GNU-Solaris-Sparc/StationModeThread.o build/Debug/ GNU-Solaris-Sparc/AccMain.o build/Debug/GNU-Solaris-Sparc/ModbusTcpServer.o build/Debug/GNU-Solaris-Sparc/Passenge rFlowSmith.o build/Debug/GNU-Solaris-Sparc/CacheKeeper.o build/Debug/GNU-Solaris-Sparc/SegmentedStationMode.o build/Debug/GNU-Solaris-Sparc/AccInfoImpl.o build/Debug/GNU-Solaris- Sparc/AsioClient.o build/Debug/GNU-Solaris-Sparc/AccDataSenderThread.o build/Debug/GNU-Solaris-Sparc/ModbusRequest.o build/Debug/GNU-Solaris-Sparc/AccDataSender.o build/Debug/GNU- Solaris-Sparc/StationModeSmith.o build/Debug/GNU-Solaris-Sparc/AccDataSenderTcpServer.o build/Debug/GNU-Solaris-Sparc/ModbusException.o build/Debug/GNU-Solaris-Sparc/CacheImpl.o build/Debug/ GNU-Solaris-Sparc/EventManagerThread.o build/Debug/GNU-Solaris-Sparc/CacheKeeperThread.o build/Debug/GNU-Solaris-Sparc/log.o build/Debug/GNU-Solaris-Sparc/AccAgent.o -L ../../../cots/poco_1_4_6/lib/SunOS/sun4v -L../../../cots/protobuf_2_4_1/src/.libs -L../../../cots/ boost_1_55_0/stage/lib -L../../../tools/lib -L../../../cots/oracle/1120/solaris10_sparc/lib -L../../../ sdk -L../../../cots/RCF_2_0_0_2670/library -lposix4 -lboost_program_options -lboost_系统 -lboost_filesystem -lboost_thread -lclntsh -lprotobuf -lRCFLibrary -lPocoNetd -lPocoUtild -lPocoFoundationd
该应用有时会转储以下信息:
程序以信号 11 终止,分段错误。
[新进程735251]
[新进程800787]
[新进程866323]
[新进程931859]
[新进程997395]
[新进程79891]
[新进程407571]
[新进程538643]
[新进程604179]
[新进程669715]
0 0xfdbbe7fc in elf_find_sym () from /usr/lib/ld.so.1
第三次,我也使用 posix 线程并使用 follow 构建(添加 -lpthread):
g++ -lpthread -pthreads -lsocket -lnsl -o dist/Debug/GNU-Solaris-Sparc/accagent build/Debug/GNU-Solaris-Sparc/PassengerFlowThread.o build/Debug/GNU-Solaris-Sparc/AccDataTaker。 o build/Debug/GNU-Solaris-Sparc/AccCache.o build/Debug/GNU-Solaris-Sparc/Acc.o build/Debug/GNU-Solaris-Sparc/DeviceStatusThread.o build/Debug/GNU-Solaris-Sparc/ EntityAccessFactory.o build/Debug/GNU-Solaris-Sparc/BasicSmith.o build/Debug/GNU-Solaris-Sparc/CBThread.o build/Debug/GNU-Solaris-Sparc/SegmentedDeviceStatus.o build/Debug/GNU-Solaris- Sparc/AccInfo.pb.o build/Debug/GNU-Solaris-Sparc/CBException.o build/Debug/GNU-Solaris-Sparc/TimerThread.o build/Debug/GNU-Solaris-Sparc/STEModbusRequest.o build/Debug/ GNU-Solaris-Sparc/SegmentedPassengerFlow.o build/Debug/GNU-Solaris-Sparc/ModbusConfigMap.o build/Debug/GNU-Solaris-Sparc/DeviceStatusSmith.o build/Debug/GNU-Solaris-Sparc/StationModeThread.o build/ Debug/GNU-Solaris-Sparc/AccMain.o build/Debug/GNU-Solaris-Sparc/ModbusTcpServer.o build/Debug/GNU-Solaris-Spar c/PassengerFlowSmith.o build/Debug/GNU-Solaris-Sparc/CacheKeeper.o build/Debug/GNU-Solaris-Sparc/SegmentedStationMode.o build/Debug/GNU-Solaris-Sparc/AccInfoImpl.o build/Debug/GNU- Solaris-Sparc/AsioClient.o build/Debug/GNU-Solaris-Sparc/AccDataSenderThread.o build/Debug/GNU-Solaris-Sparc/ModbusRequest.o build/Debug/GNU-Solaris-Sparc/AccDataSender.o build/Debug/ GNU-Solaris-Sparc/StationModeSmith.o build/Debug/GNU-Solaris-Sparc/AccDataSenderTcpServer.o build/Debug/GNU-Solaris-Sparc/ModbusException.o build/Debug/GNU-Solaris-Sparc/CacheImpl.o build/ Debug/GNU-Solaris-Sparc/EventManagerThread.o build/Debug/GNU-Solaris-Sparc/CacheKeeperThread.o build/Debug/GNU-Solaris-Sparc/log.o build/Debug/GNU-Solaris-Sparc/AccAgent.o -L../../../cots/poco_1_4_6/lib/SunOS/sun4v -L../../../cots/protobuf_2_4_1/src/.libs -L../../../婴儿床/boost_1_55_0/stage/lib -L../../../tools/lib -L../../../cots/oracle/1120/solaris10_sparc/lib -L../../。 ./sdk -L../../../cots/RCF_2_0_0_2670/library -lposix4 -lboost_program_option s -lboost_system -lboost_filesystem -lboost_thread -lclntsh -lprotobuf -lRCFLibrary -lPocoNetd -lPocoUtild -lPocoFoundationd
现在应用程序运行了大约一天,没有崩溃和任何其他异常。
我的问题是:
1)-lpthread和-pthreads有什么区别?
2)“/usr/lib/ld.so.1”会影响我的应用吗?
3)我是否解决了与 -lpthread 和 -pthreads 的链接的问题?
顺便说一句,没有 -pthreads,我的应用无法通过构建。
【问题讨论】:
-
我检查我的 gcc 转储规范如下:-bash-3.00$ gcc -dumpspecs | grep pthread %{compat-bsd:-lucb -lsocket -lnsl -lelf -laio} %{!shared: %{!symbolic: %{pthreads:-lpthread} %{!pthreads:%{threads:-lthread}} % {p|pg:-ldl} -lc}} %{pthreads:-D_REENTRANT -D_PTHREADS} %{!pthreads:%{threads:-D_REENTRANT -D_SOLARIS_THREADS}} %{compat-bsd:-iwithprefixbefore ucbinclude -I/usr/ ucbinclude}
标签: c++ boost pthreads solaris