我的应用程序在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,我的应用程序无法通过构建。
答案 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。这个问题已经解决了。