solaris 10 gcc 4.8.2上的-lpthread和-phreads之间有什么区别

What is the difference between -lpthread and -pthreads on solaris 10 gcc 4.8.2

本文关键字:-phreads 之间 区别 什么 -lpthread 上的 gcc solaris      更新时间:2023-10-16

我的应用程序在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::线程并使用以下内容构建应用程序:

g++-phreads-locket-lnsl-o dist/Debug/GNU Solaris Sparc/accagent build/Debug/GNU Solaris Sparc/PassengerFlowThread.o build/Debug/NU Solaris Sparc/AccDataTaker.o build/Debug/GU Solaris Sparc/AccCache.o build/Debug/NU SolarisSparc/DeviceStatusThread.o uild/Debug/NUU Solaris Sparc/EntityAccessFactory.obuild/Debug/GNU Solaris Sparc/BasicSmith.o build/Debug/GU Solaris Sparc/CBThread.o build/Debug/NU Solaris Sparc/SegmentedDeviceStatus.o build/Debug/NU SolarisSparc/AccInfo.pb.o build/DeDebug/NU Solaris Sparc/CBException.o build/Debug/NU Solaris Sparc/TimerThread.o uild/Debug/Nu Solaris Sparc/STEModbusRequest.o build/Debug/NU Solaris Sparc/SegmentedPassengerFlow.obuild/Debug/GNU Solaris Sparc/ModbusConfigMap.o build/Debug/GU Solaris Sparc/DeviceStatusSmith.o build/Debug/GNUSolaris Sparc/StationModeThread.o build/Debug/GU Solaris Sparc/AccMain.o build/Debug/GU Solaris Sparc/ModbusTcpServer.o build/Debug/GN Solaris Sparc/PassengerFlowSmith.o build/dibug/GU SolarisSparc/CacheKeeper.o build/Debug/GN Solaris Sparc/SegmentedStationMode.obuild/Debug/GNU Solaris Sparc/AccInfoImpl.o build/Debug/GU Solaris Sparc/AsioClient.o build/Debug/NU Solaris Sparc/AccDataSenderThread.o build/Debug/NU SolarisSparc/ModbusRequest.o build/Debug/NU Solaris Sparc/AccdDataSender.o build/Debug/GNU SolarisSparc/StationModeSmith.o build/Debug/GU Solarissparc/AccDataSenderTcpServer.o build/Debug/GU Solaris Sparc/ModbusException.obuild/Debug/GNU Solaris Sparc/CacheImpl.o build/Debug/NU Solaris Sparc/EventManagerThread.o build/Debug/GU Solaris Sparc/CacheKeeperThread.o uild/Debug/GN Solaris Sparc/log.o build/Debug/NU SolarisSparc/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_2670/库-lposix4-lbost_program_options-lbostrongystem-lbost_files系统-lbost_thread-lclntsh-lprotobuf-lRCF库-lPocoNetd-lPocoUtild-lPocoFoundationd

当应用程序运行时,boost::线程通常无法创建。

第二次,我使用posix线程并使用以下内容构建应用程序:

g++-phreads-locket-lnsl-o dist/Debug/GNU Solaris Sparc/accagent build/Debug/GNU Solaris Sparc/PassengerFlowThread.o build/Debug/NU Solaris Sparc/AccDataTaker.o build/Debug/GU Solaris Sparc/AccCache.o build/Debug/NU SolarisSparc/DeviceStatusThread.o uild/Debug/NUU Solaris Sparc/EntityAccessFactory.obuild/Debug/GNU Solaris Sparc/BasicSmith.o build/Debug/GU Solaris Sparc/CBThread.o build/Debug/NU Solaris Sparc/SegmentedDeviceStatus.o build/Debug/NU SolarisSparc/AccInfo.pb.o build/DeDebug/NU Solaris Sparc/CBException.o build/Debug/NU Solaris Sparc/TimerThread.o uild/Debug/Nu Solaris Sparc/STEModbusRequest.o build/Debug/NU Solaris Sparc/SegmentedPassengerFlow.obuild/Debug/GNU Solaris Sparc/ModbusConfigMap.o build/Debug/GU Solaris Sparc/DeviceStatusSmith.o build/Debug/GNUSolaris Sparc/StationModeThread.o build/Debug/GU Solaris Sparc/AccMain.o build/Debug/GU Solaris Sparc/ModbusTcpServer.o build/Debug/GN Solaris Sparc/PassengerFlowSmith.o build/dibug/GU SolarisSparc/CacheKeeper.o build/Debug/GN Solaris Sparc/SegmentedStationMode.obuild/Debug/GNU Solaris Sparc/AccInfoImpl.o build/Debug/GU Solaris Sparc/AsioClient.o build/Debug/NU Solaris Sparc/AccDataSenderThread.o build/Debug/NU SolarisSparc/ModbusRequest.o build/Debug/NU Solaris Sparc/AccdDataSender.o build/Debug/GNU SolarisSparc/StationModeSmith.o build/Debug/GU Solarissparc/AccDataSenderTcpServer.o build/Debug/GU Solaris Sparc/ModbusException.obuild/Debug/GNU Solaris Sparc/CacheImpl.o build/Debug/NU Solaris Sparc/EventManagerThread.o build/Debug/GU Solaris Sparc/CacheKeeperThread.o uild/Debug/GN Solaris Sparc/log.o build/Debug/NU SolarisSparc/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_2670/库-lposix4-lbost_program_options-lbostrongystem-lbost_files系统-lbost_thread-lclntsh-lprotobuf-lRCF库-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线程,并使用以下代码构建(add-lpthread):

g++-lpthread-phreads-lsocket-lnsl-o dist/Debug/GNU Solaris Sparc/accagent build/Debug/NUU Solaris Sparc/PassengerFlowThread.o build/Debug/NUU SolarisSparc/AccDataTaker.o build/Debbug/NUU索拉里斯Sparc/AccAcher.o build/Degug/NGNU Solarissparc/Acc.o build/DDebug/NUU Solaris Sparc/DeviceStatusThread.obuild/Debug/GNU Solaris Sparc/BasicSmith.o build/Debug/GU Solaris Sparc/CBThread.o build/Debug/NU Solaris Sparc/SegmentedDeviceStatus.o build/Debug/NU SolarisSparc/AccInfo.pb.o build/DeDebug/NU Solaris Sparc/CBException.o build/Debug/NU Solaris Sparc/TimerThread.o uild/Debug/Nu Solaris Sparc/STEModbusRequest.o build/Debug/NU Solaris Sparc/SegmentedPassengerFlow.obuild/Debug/GNU Solaris Sparc/ModbusConfigMap.o build/Debug/GU Solaris Sparc/DeviceStatusSmith.o build/Debug/GNUSolaris Sparc/StationModeThread.o build/Debug/GU Solaris Sparc/AccMain.o build/Debug/GU Solaris Sparc/ModbusTcpServer.o build/Debug/GN Solaris Sparc/PassengerFlowSmith.o build/dibug/GU SolarisSparc/CacheKeeper.o build/Debug/GN Solaris Sparc/SegmentedStationMode.obuild/Debug/GNU Solaris Sparc/AccInfoImpl.o build/Debug/GU Solaris Sparc/AsioClient.o build/Debug/NU Solaris Sparc/AccDataSenderThread.o build/Debug/NU SolarisSparc/ModbusRequest.o build/Debug/NU Solaris Sparc/AccdDataSender.o build/Debug/GNU SolarisSparc/StationModeSmith.o build/Debug/GU Solarissparc/AccDataSenderTcpServer.o build/Debug/GU Solaris Sparc/ModbusException.obuild/Debug/GNU Solaris Sparc/CacheImpl.o build/Debug/NU Solaris Sparc/EventManagerThread.o build/Debug/GU Solaris Sparc/CacheKeeperThread.o uild/Debug/GN Solaris Sparc/log.o build/Debug/NU SolarisSparc/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_2670/库-lposix4-lbost_program_options-lbostrongystem-lbost_files系统-lbost_thread-lclntsh-lprotobuf-lRCF库-lPocoNetd-lPocoUtild-lPocoFoundationd

现在该应用程序运行了大约一天,没有崩溃和任何其他异常。

我的问题是:

1) -lpthread和-phreads之间有什么区别?

2) 是"/usr/lib/ld.so.1";影响我的应用程序?

3) 我用-lpthread和-phreads解决了链接的问题吗?

顺便说一句,如果没有-ppthreads,我的应用程序就无法通过构建。

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

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

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

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