2014-04-11 27 views
0

我的應用程序在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,我的應用程序無法通過構建。

+0

我檢查我的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

+0

[gcc - 編譯時的-pthread標誌的意義]可能的重複(http://stackoverflow.com/questions/2127797/gcc-significance-of-pthread-flag-when-compiling) – juanchopanza

回答

0

最後我發現轉儲是我的協議緩衝區鏈接問題。在我的協議緩衝區的.libs目錄中找不到libprotoc.so.7.0的軟鏈接(libprotoc.so),所以它自動鏈接了libprotoc 。一個 。我創建了動態鏈接libprotoc.so指向libprotoc.so.7.0。問題已解決。

1

通常,在鏈接過程中使用-l選項時,它會告知將程序鏈接到指定庫,因此-lpthread指示與pthread庫鏈接,並將庫的文件名稱爲libpthread.a,libpthread。如此或類似。

包含文件包含對Oracle Solaris線程函數的聲明。包含文件包含Pthreads函數的聲明。

鏈接器標誌-lpthread指示鏈接pthread API(libpthread庫)和libthread庫中的-mt選項鍊接。使用Pthread時需要使用這兩個標誌,因爲libpthread爲libthread提供了一個接口。

+0

謝謝你的回答你的意思是我應該在我的gcc選項中添加-mt標誌? – Zebiak

+0

是的,這是Oracle推薦的 –

+0

g ++沒有-mt選項?g ++:error:無法識別的命令行選項'-mt' – Zebiak