首页 文章

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

提问于
浏览
0

我的应用程序在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 / PassengerFlo wSmith.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_syst em -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 / PassengerFlo wSmith.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_syst EM-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-Sparc / Pa ssengerFlowSmith.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 -l boost_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 回答

  • 1

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

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

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

  • 0

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

相关问题