solaris 10 gcc 4.8.2上-lpthread和-pthreads之间的区别是什么?

时间:2014-04-11 02:22:48

标签: c++ boost pthreads solaris

我的应用程序在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_ system -lboost_filesystem -lboost_thread -lclntsh -lprotobuf -lRCFLibrary -lPocoNetd -lPocoUtild -lPocoFoundationd

当app运行时,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_ system -lboost_filesystem -lboost_thread -lclntsh -lprotobuf -lRCFLibrary -lPocoNetd -lPocoUtild -lPocoFoundationd

应用程序有时会转储以下信息:

  

程序以信号11,分段故障终止。

     

[新流程735251]

     

[新流程800787]

     

[新流程866323]

     

[新流程931859]

     

[新流程997395]

     

[新流程79891]

     

[新流程407571]

     

[新流程538643]

     

[新流程604179]

     

[新程序669715]

     来自/usr/lib/ld.so.1的elf_find_sym()中的

0 0xfdbbe7fc

第三次,我也使用posix线程并使用follow(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-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 ../../../ 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_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,我的应用程序无法通过构建。

2 个答案:

答案 0 :(得分:1)

通常,在链接期间使用-l选项时,它会告诉程序与命名库的链接,因此-lpthread表示链接到pthread库,库的文件名为libpthread.a,libpthread.so或类似的。

include文件包含Oracle Solaris线程函数的声明。 include文件包含Pthreads函数的声明。

链接器标志-lpthread表示链接在pthread API(libpthread库)中,-mt选项链接在libthread库中。使用Pthreads时需要这两个标志,因为libpthread提供了libthread的接口。

答案 1 :(得分:0)

最后我发现转储是我的协议缓冲区链接问题。在我的协议缓冲区的.libs目录中找不到libprotoc.so.7.0的软链接(libprotoc.so),所以它是自动链接libprotoc。一个 。我创建动态链接libprotoc.so指向libprotoc.so.7.0。这个问题已经解决了。