c++ - 使用 Cygwin/GCC 构建 Boost 库时的名称冲突

标签 c++ gcc boost cygwin

我正在将 C++ 应用程序从 VC++ 迁移到 GCC(使用 Cygwin 在 Windows 上运行)。我现在的第一个问题是我无法构建 Boost 库。

例如用 VC++ 构建 Boost.Exception 我会写:

b2 --with-exception variant=debug,release link=static runtime-link=static

我会在我的 stage\lib 目录中获取文件 libboost_exception-vc100-mt-s-1_51.lib 和 libboost_exception-vc100-mt-sgd-1_51.lib。

但是,当我在 Cygwin 终端上使用 GCC 尝试相同的操作时,我遇到了错误。我发现像这样只构建调试(或只发布)是可行的:

./b2 --with-exception variant=debug link=static runtime-link=static

它在我的 stage\lib 目录中为这两种情况(调试和发布)创建了 libboost_exception.a。所以似乎存在名称冲突(调试和发布变体的名称相同)。这是 boost 构建系统中的错误还是我做错了什么?


编辑:

输出

./b2 --with-exception variant=debug,release link=static runtime-link=static

是:

Building the Boost C++ Libraries.

/cygdrive/c/boost_1_51_0/tools/build/v2/build/virtual-target.jam:1079: in virtual-target.register-actual-name from module virtual-target

error: Duplicate name of actual target: libboost_exception.a

error: previous virtual target { common%common.copy-libboost_exception.a.STATIC_LIB { gcc%gcc.archive-libboost_exception.a.STATIC_LIB { gcc%gcc.compile.c++-clone_current_exception_non_intrusive.o.OBJ { clone_current_exception_non_intrusive.cpp.CPP } } } }

error: created from ./stage-proper error: another virtual target { common%common.copy-libboost_exception.a.STATIC_LIB { gcc%gcc.archive-libboost_exception.a.STATIC_LIB { gcc%gcc.compile.c++-clone_current_exception_non_intrusive.o.OBJ { clone_current_exception_non_intrusive.cpp.CPP } } } }

error: created from ./stage-proper

error: added properties: off NDEBUG full speed off release

error: removed properties: on off off on debug

/cygdrive/c/boost_1_51_0/tools/build/v2/build/virtual-target.jam:490: in actualize-no-scanner from module object(file-target)@1014

/cygdrive/c/boost_1_51_0/tools/build/v2/build/virtual-target.jam:135: in object(file-target)@1014.actualize from module object(file-target)@1014

/cygdrive/c/boost_1_51_0/tools/build/v2/build-system.jam:749: in load from module build-system

/cygdrive/c/boost_1_51_0/tools/build/v2/kernel/modules.jam:283: in import from module modules

/cygdrive/c/boost_1_51_0/tools/build/v2/kernel/bootstrap.jam:142: in boost-build from module

/cygdrive/c/boost_1_51_0/boost-build.jam:17: in module scope from module

最佳答案

虽然错误信息并不完美,但这是运算符(operator)错误。默认情况下,构建使用库的系统命名——您在典型 Unix 系统上的命名。所以,是的,如果您尝试构建调试和发布变体,您会遇到命名冲突。

如果您将 --layout=tagged--layout=versioned 添加到您的命令行,应该可以正常工作。您可以从顶层目录运行“./b2 --help”以获得这些含义的一些解释。

关于c++ - 使用 Cygwin/GCC 构建 Boost 库时的名称冲突,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12160985/

相关文章:

c++ - 强制链接未使用的共享库

c++ - 打印链接列表的元素,但是打印相反的C++

C++ `inline` 关键字和编译器优化

c++ - GCC 和 binutils build - C 编译器无法创建可执行文件

c - 在 gcc 4.8 版本中, 'var' 的地址将始终计算为 'true'

c++ - 在 C++ 中使用 Boost Threads 的基本程序的问题

c++ - 在C程序中调用C++代码时,`extern“C”`会做什么?

c++ - 为什么在 Gnu gcc/g++ 中为三字母序列解析字符串文字?

c++ - 如何将 vector 的一个元素作为 C++ 中的引用传递给函数?

c++ - 为什么我们需要 enable_shared_from_this