【问题标题】:What is the difference between -lpthread and -pthreads on solaris 10 gcc 4.8.2solaris 10 gcc 4.8.2 上的 -lpthread 和 -pthreads 有什么区别
【发布时间】:2014-04-11 02:22:47
【问题描述】:

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

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

程序以信号 11 终止,分段错误。

[新进程735251]

[新进程800787]

[新进程866323]

[新进程931859]

[新进程997395]

[新进程79891]

[新进程407571]

[新进程538643]

[新进程604179]

[新进程669715]

0 0xfdbbe7fc in elf_find_sym () from /usr/lib/ld.so.1

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

【问题讨论】:

  • 我检查我的 gcc 转储规范如下:-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}

标签: c++ boost pthreads solaris


【解决方案1】:

一般来说,当你在链接过程中使用-l选项时,它告诉程序链接到指定的库,因此-lpthread表示链接到pthread库,库的文件名为libpthread.a,libpthread.so或类似的。

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

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

【讨论】:

【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-14
    • 2011-08-16
    • 2017-07-16
    • 1970-01-01
    • 2010-10-20
    相关资源
    最近更新 更多