0

我正在尝试在带有 GCC 4.73 的 Ubuntu 13.04 上使用 CMake 编译 Boost ASIO 示例。

http://www.boost.org/doc/libs/1_54_0/doc/html/boost_asio/example/cpp11/echo/blocking_tcp_echo_client.cpp

http://www.boost.org/doc/libs/1_54_0/doc/html/boost_asio/example/cpp11/echo/async_tcp_echo_server.cpp

使用以下 CMake 文件:

cmake_minimum_required(VERSION 2.8)

ADD_DEFINITIONS(-std=c++11)
project(server)

find_package( Boost 1.53.0 REQUIRED system)
INCLUDE_DIRECTORIES( ${Boost_INCLUDE_DIR} )

add_executable( server server.cpp )
target_link_libraries(server ${Boost_LIBRARIES} )

add_executable( client client.cpp )
target_link_libraries(client ${Boost_LIBRARIES})

该项目应该使用 C++11 并且独立于平台。使用 CMakefile 编译时,我得到类似

undefined reference to `pthread_join'

我的同事可以毫无问题地编译完全相同的 Makefile。

问题:有什么方法可以强制 CMake 或 Boost 不使用 PThreads 而是使用 C++11 线程来保持平台独立?

编辑:服务器编译没有问题,而只有客户端有问题。

4

1 回答 1

5

有什么方法可以强制 CMake 或 Boost 不使用 PThreads 而是使用 C++11 线程来保持平台独立?

不,Boost.Threads 和 GCC 的 C++ 线程库都是作为 Pthreads 上的一个相当薄的层实现的。

所以你有任何线索,为什么它可以在我的同事 Linux 机器上使用相同的 make 文件?也许他的编译器会自动链接pthread?

可以配置 GCC--enable-libstdcxx-time=rt使 C++ 标准库链接到librtlibpthread. 这意味着您不需要链接-pthread,因此您的同事可能正在使用这样配置的 GCC。该配置选项不是默认选项,因为自动链接到libpthread.so会对使用 C++ 标准库某些部分的单线程程序的性能产生负面影响。

于 2013-09-11T19:31:12.637 回答