我的應用程序在Solaris SPARC上運行,並與G ++ 4.8.2建立的區別,版本細節是:是什麼-lpthread和-pthreads在Solaris 10上的gcc 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/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../../../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_system -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/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../../../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_system -lboost_filesystem -lboost_thread -lclntsh -lprotobuf -lRCFLibrary -lPocoNetd -lPocoUtild -lPocoFoundationd
應用一些次隨訪信息轉儲:
Program terminated with signal 11, Segmentation fault.
[New process 735251 ]
[New process 800787 ]
[New process 866323 ]
[New process 931859 ]
[New process 997395 ]
[New process 79891 ]
[New process 407571 ]
[New process 538643 ]
[New process 604179 ]
[New process 669715 ]
0 0xfdbbe7fc in elf_find_sym() from /usr/lib/ld.so.1
第三次,我也使用POSIX線程和構建跟隨(add -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-Sparc/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../../../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_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 dumpspecs如下:-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} – Zebiak
[gcc - 編譯時的-pthread標誌的意義]可能的重複(http://stackoverflow.com/questions/2127797/gcc-significance-of-pthread-flag-when-compiling) – juanchopanza