如何在MacOS上使用Boost C++库

3
我正在尝试在MacOS上使用Boost库。
我使用brew install boost安装了boost。这将boost安装在usr/local/Cellar/boost中。
我使用相同的命令g++ --std=c++11 main.cpp -o main编译了两个程序,然后运行./main
但是第一个程序编译成功,而第二个却没有。我该怎么办?
程序1.
#include <boost/lambda/lambda.hpp>
#include <iostream>
#include <iterator>
#include <algorithm>

int main()
{
    using namespace boost::lambda;
    typedef std::istream_iterator<int> in;

    std::for_each(
        in(std::cin), in(), std::cout << (_1 * 3) << " " );
}

程序2。

#include <boost/test/unit_test.hpp>

int add( int i, int j ) { return i+j; }

BOOST_AUTO_TEST_CASE( my_test )
{
    BOOST_CHECK( add( 2,2 ) == 4 );       

    BOOST_REQUIRE( add( 2,2 ) == 4 );     

    if( add( 2,2 ) != 4 )
      BOOST_ERROR( "Ouch..." );      

    if( add( 2,2 ) != 4 )
      BOOST_FAIL( "Ouch..." );           

    if( add( 2,2 ) != 4 ) throw "Ouch..."; 

    BOOST_CHECK_MESSAGE( add( 2,2 ) == 4, 
                         "add(..) result: " << add( 2,2 ) );

    BOOST_CHECK_EQUAL( add( 2,2 ), 4 );  
}

当我编译程序2时,出现了以下错误。
Undefined symbols for architecture x86_64:
  "boost::test_tools::tt_detail::report_assertion(boost::test_tools::assertion_result const&, boost::unit_test::lazy_ostream const&, boost::unit_test::basic_cstr
ing<char const>, unsigned long, boost::test_tools::tt_detail::tool_level, boost::test_tools::tt_detail::check_type, unsigned long, ...)", referenced from:
      my_test::test_method() in del-9b4dcb.o

      bool boost::test_tools::tt_detail::check_frwd<boost::test_tools::tt_detail::equal_impl_frwd, int, int>(boost::test_tools::tt_detail::equal_impl_frwd, boost
::unit_test::lazy_ostream const&, boost::unit_test::basic_cstring<char const>, unsigned long, boost::test_tools::tt_detail::tool_level, boost::test_tools::tt_det
ail::check_type, int const&, char const*, int const&, char const*) in del-9b4dcb.o
  "boost::unit_test::unit_test_log_t::set_checkpoint(boost::unit_test::basic_cstring<char const>, unsigned long, boost::unit_test::basic_cstring<char const>)", r
eferenced from:
      my_test_invoker() in del-9b4dcb.o
      my_test::test_method() in del-9b4dcb.o
  "boost::unit_test::test_case::test_case(boost::unit_test::basic_cstring<char const>, boost::unit_test::basic_cstring<char const>, unsigned long, boost::functio
n<void ()> const&)", referenced from:
      boost::unit_test::make_test_case(boost::function<void ()> const&, boost::unit_test::basic_cstring<char const>, boost::unit_test::basic_cstring<char const>,
 unsigned long) in del-9b4dcb.o
  "boost::unit_test::ut_detail::auto_test_unit_registrar::auto_test_unit_registrar(boost::unit_test::test_case*, boost::unit_test::decorator::collector&, unsigne
d long)", referenced from:
      ___cxx_global_var_init.1 in del-9b4dcb.o
  "boost::unit_test::ut_detail::normalize_test_case_name(boost::unit_test::basic_cstring<char const>)", referenced from:
      boost::unit_test::make_test_case(boost::function<void ()> const&, boost::unit_test::basic_cstring<char const>, boost::unit_test::basic_cstring<char const>,
 unsigned long) in del-9b4dcb.o
  "vtable for boost::unit_test::unit_test_log_t", referenced from:
      boost::unit_test::unit_test_log_t::unit_test_log_t() in del-9b4dcb.o
  NOTE: a missing vtable usually means the first non-inline virtual member function has no definition.
  "_main", referenced from:
     implicit entry/start for main executable
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)

你需要使用 -I/usr/local/include 包含头文件,并且如果需要的话,使用 -L/usr/local/lib 进行链接。可能需要加上 -lboost_foo_bar。 - kometen
@kometen g++ main.cpp -o main -I /usr/local/include -L /usr/local/lib -l boost-test 不起作用。它会出现一个错误 ld: library not found for -lboost-test - Harsh K
在-I和/usr之间以及-L和/usr之间不需要空格。您可能需要使用-lboost_unit_test_framework.a。执行“ls -l /usr/local/lib/libboost_test”以查看库的名称。 - kometen
我现在正在使用 g++ main.cpp -o main -I/usr/local/include -L/usr/local/lib/ -libboost_test_exec_monitor.a。仍然显示相同的错误。:( - Harsh K
使用-l(小写L)时,您无需在libboost_foo_bar.a中添加前缀lib。因此,语法是-lboost_foo_bar.a。 - kometen
2个回答

0
链接器错误发生在编译器无法找到所需库二进制文件时。您需要指定路径到boost test库。问题是您的boost库在哪里 - 可能不是/usr/local/lib,而是Mac上的/usr/local/Cellar/boost/.../lib
因此,请使用类似以下内容的东西:
g++ -L/usr/local/Cellar/boost/.../lib main.cpp -o main -lboost_unit_test_framework

0

看着Boost的文档,你可能想尝试以下的包含语句。

#include <boost/test/included/unit_test.hpp>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接