栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

C++项目如何使用CMakeLists.txt添加boost库

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

C++项目如何使用CMakeLists.txt添加boost库

如果你的工程使用到了boost库,并且工程是由CMakeLists.txt构建的,这个文章会展示如何添加boost到Cmake中,其中顺带使用了gtest搭建测试用例

假设有一个工程,目录结构如下

.
├── boost_thread_test.cc
└── CMakeLists.txt

0 directories, 2 files

其中测试用例代码使用到了boost::chrono和boost::thread:

#include 

#include 
#include 

static int make_one_thread() {
  boost::thread bt([] { std::cout << "hello worldn"; });
  bt.join();
  return 0;
}

static int interrupt_one_thread() {
  boost::thread bt([] {
    try {
      while (1) {
        boost::this_thread::sleep_for(boost::chrono::milliseconds(300));
        std::cout << "hello worldn";
      }
    } catch (const std::exception& e) {
      std::cerr << e.what() << 'n';
    } catch (const boost::thread_interrupted& e) {
      std::cerr << "thread interruped" << 'n';
    }
  });

  boost::this_thread::sleep_for(boost::chrono::milliseconds(1000));
  bt.interrupt();

  bt.join();
  boost::chrono::steady_clock::now();
  return 0;
}

TEST(test_boost, case_thread1) { ASSERT_EQ(make_one_thread(), 0); }

TEST(test_boost, case_thread2) { ASSERT_EQ(interrupt_one_thread(), 0); }

那么 我们的cmakelistst应该这样写,来将gtest和boost线程和时间库添加进去,boost其他非header-only库同理:

cmake_minimum_required(VERSION 3.6)

set(CMAKE_BUILD_TYPE Debug)

project(unit_test C CXX)

# 此处仅添加thread和chrono  你可以添加你需要的
find_package(Boost REQUIRED COMPONENTS thread chrono)

if(Boost_FOUND)
    include_directories(${Boost_INCLUDE_DIR})
endif()

enable_testing()
find_package(GTest REQUIRED)

set(TEST_LIST
    boost_thread_test
)

foreach(src ${TEST_LIST})
	add_executable(${src}  ${src}.cc)
	target_link_libraries(${src} GTest::GTest GTest::Main Boost::thread Boost::chrono pthread)
	#也可以 target_link_libraries(${src} GTest::GTest GTest::Main boost_thread boost_chrono pthread)
	#也可以 target_link_libraries(${src} GTest::GTest GTest::Main ${Boost_THREAD_LIBRARY} ${Boost_CHRONO_LIBRARY} pthread)
	#甚至可以 target_link_libraries(${src} GTest::GTest GTest::Main ${Boost_LIBRARIES} pthread)
	add_test(${src} ${src})
endforeach()

测试一下这个测试用例:

mkdir build && cd build && cmake .. && make -j 
./boost_thread_test

结果:

Running main() from /build/googletest-OI1WhS/googletest-1.10.0.20201025/googletest/src/gtest_main.cc
[==========] Running 2 tests from 1 test suite.
[----------] Global test environment set-up.
[----------] 2 tests from test_boost
[ RUN      ] test_boost.case_thread1
hello world
[       OK ] test_boost.case_thread1 (0 ms)
[ RUN      ] test_boost.case_thread2
hello world
hello world
hello world
thread interruped
[       OK ] test_boost.case_thread2 (1001 ms)
[----------] 2 tests from test_boost (1001 ms total)

[----------] Global test environment tear-down
[==========] 2 tests from 1 test suite ran. (1003 ms total)
[  PASSED  ] 2 tests.

完美~ 顺带还介绍了如何使用gtest和cmake构建单元测试用例 ~~ nice

好了就这样吧 看了一圈国内好像没找到一篇文章好好说如何引用boost库的(大概我眼瞎),正好做一篇

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1027166.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号