将 Boost 库与 Borland C++ 命令行工具一起使用

Posted

技术标签:

【中文标题】将 Boost 库与 Borland C++ 命令行工具一起使用【英文标题】:Using Boost library with Borland C++ Command Line Tool 【发布时间】:2014-04-24 02:52:04 【问题描述】:

我在使用 Borland C++ 命令行工具(Borland C++ 5.5.1 for Win32)编译包含 boost (1.55.0) 的 C++ 代码时遇到问题。

我从 Boost Getting Started 页面测试示例,example.cpp:

#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) << " " );
    return 0;

我已修改 bcc32.cfg 文件以包含 boost 标头,如下所示:

-I"c:\Borland\Bcc55\include"
-I"C:\boost_1_55_0"
-L"c:\Borland\Bcc55\lib"

然后,我尝试使用bcc32 example.cpp进行编译,得到以下错误:

Error E2221 C:\boost_1_55_0\boost/static_assert.hpp 62: Macro argument syntax error
Error E2221 C:\boost_1_55_0\boost/static_assert.hpp 182: Macro argument syntax error
Error E2238 C:\boost_1_55_0\boost/tuple/detail/tuple_basic.hpp 429: Multiple declaration for 'length<tuple<null_type,null_type,null_type,null_type,null_type,null_type,null_type,null_type,null_type,null_type> >'
Error E2344 C:\boost_1_55_0\boost/tuple/detail/tuple_basic.hpp 424: Earlier declaration of 'length<tuple<null_type,null_type,null_type,null_type,null_type,null_type,null_type,null_type,null_type,null_type> >'
Error E2238 C:\boost_1_55_0\boost/tuple/detail/tuple_basic.hpp 439: Multiple declaration for 'length<null_type>'
Error E2344 C:\boost_1_55_0\boost/tuple/detail/tuple_basic.hpp 434: Earlier declaration of 'length<null_type>'
Error E2108 C:\boost_1_55_0\boost/tuple/detail/tuple_basic.hpp 700: Improper use of typedef 'detail::ignore_t'
Error E2299 C:\boost_1_55_0\boost/tuple/detail/tuple_basic.hpp 700: Cannot generate template specialization from 'make_tuple_traits<T>'
Error E2321 C:\boost_1_55_0\boost/tuple/detail/tuple_basic.hpp 702: Declaration does not specify a tag or an identifier
Error E2108 C:\boost_1_55_0\boost/tuple/detail/tuple_basic.hpp 832: Improper use of typedef 'ignore_t'
Error E2299 C:\boost_1_55_0\boost/tuple/detail/tuple_basic.hpp 832: Cannot generate template specialization from 'tie_traits<T>'
Error E2321 C:\boost_1_55_0\boost/tuple/detail/tuple_basic.hpp 834: Declaration does not specify a tag or an identifier
Error E2401 C:\boost_1_55_0\boost/lambda/detail/lambda_traits.hpp 89: Invalid template argument list
Error E2040 C:\boost_1_55_0\boost/lambda/detail/lambda_traits.hpp 91: Declaration terminated incorrectly
Error E2401 C:\boost_1_55_0\boost/lambda/detail/lambda_traits.hpp 256: Invalid template argument list
Error E2040 C:\boost_1_55_0\boost/lambda/detail/lambda_traits.hpp 257: Declaration terminated incorrectly
Error E2238 C:\boost_1_55_0\boost/lambda/detail/lambda_traits.hpp 408: Multiple declaration for 'bind_traits<null_type>'
Error E2344 C:\boost_1_55_0\boost/lambda/detail/lambda_traits.hpp 401: Earlier declaration of 'bind_traits<null_type>'
Error E2434 C:\boost_1_55_0\boost/lambda/detail/lambda_traits.hpp 435: Template declaration missing template parameters ('template<...>')
Error E2238 C:\boost_1_55_0\boost/lambda/detail/lambda_traits.hpp 435: Multiple declaration for 'bind_traits<R>'
Error E2344 C:\boost_1_55_0\boost/lambda/detail/lambda_traits.hpp 389: Earlier declaration of 'bind_traits<R>'
Error E2108 C:\boost_1_55_0\boost/lambda/detail/lambda_traits.hpp 440: Improper use of typedef 'Arg1'
Error E2299 C:\boost_1_55_0\boost/lambda/detail/lambda_traits.hpp 440: Cannot generate template specialization from 'bind_traits<R>'
Error E2428 C:\boost_1_55_0\boost/lambda/detail/lambda_traits.hpp 442: Templates must be classes or functions
Error E2108 C:\boost_1_55_0\boost/lambda/detail/lambda_traits.hpp 445: Improper use of typedef 'Arg1' 
Error E2228 C:\boost_1_55_0\boost/lambda/detail/lambda_traits.hpp 445: Too many error or warning messages
*** 26 errors in Compile ***

【问题讨论】:

为什么在这个时代仍然使用 Borland?一定有人在宣传它? 有时候,你别无选择,无法控制整个事情,但仍然需要与之兼容。 BC++ 是一个太旧的编译器,无法理解现代 C++。自 BC++ 5.5.1 发布以来,C++ 语言发生了很大变化。 【参考方案1】:

Borland C++ 有很多标准合规性问题,这可能是徒劳的。 10 年前,Boost 正式放弃了对 bcc32.exe 的支持。

C++Builder XE 确实带有一个工作版本的 boost,也许你可以考虑使用它而不是 bcc 5.5。

【讨论】:

正确! Embarcadero C++ Builder XE6(当前版本)部分支持 32 位编译器的 boost 1.39,完全支持 64 位编译器的 boost 1.55 (clang)。

以上是关于将 Boost 库与 Borland C++ 命令行工具一起使用的主要内容,如果未能解决你的问题,请参考以下文章

boost.build 与 boost.python

如何从命令行为 Borland C++ Builder 5 构建项目文件和包?

如何将外部 dll 库导入 Borland C++ 6?

Borland C++ Builder 中的 Windows 子类化

如何将 C++ 库与 Python 集成?

如何将 .dll 库与 C++ VS 项目链接?