标签: boost-build

使用MinGW-w64和Boost.Build构建C++

我目前正在将我的一个项目移植到GCC,我正在使用MinGW-w64项目完成此任务,因为我需要x64和x86支持.

我在设置构建环境时遇到了问题.我的项目目前使用Boost C++库,为了使构建过程更容易,我在项目中也使用了Boost.Build(因为它使集成变得简单).

在MSVC下这很好,因为我可以从命令行执行以下操作:

b2 toolset=msvc address-model=32 # compile as 32-bit
b2 toolset=msvc address-model=64 # compile as 64-bit
Run Code Online (Sandbox Code Playgroud)

由于32位和64位工具链位于不同的目录中,MinGW-w64使这个"有问题".(分别为C:\ MinGW32和C:\ MinGW64).

是否可以设置Boost.Build,它将根据地址模型标志选择正确的工具链?如果没有,我的下一个最佳选择是什么?

编辑:

如果它有帮助,我在MinGW-w64网站的"Personal Builds"文件夹中使用rubenvb 4.6.3-1版本(我特别使用这些版本,因为我希望尝试让我的代码解析 - 但不能编译 - 在Clang下).

编辑:

我刚才想到的一个解决方案是在编译之前"手动"将PATH设置为指向正确的工具链,但是这会给我的构建过程增加一层额外的复杂性,我想避免.理想情况下,我希望它像MSVC一样简单,但我知道这可能是不可能的.在最坏的情况下,我假设我刚刚建议的工作,我只需要在调用Boost.Build之前添加脚本来正确设置PATH.这意味着硬编码路径,我不想做...

c++ windows boost mingw boost-build

7
推荐指数
1
解决办法
3366
查看次数

Boost.Python __init __()应该返回None,而不是'NoneType'

我有一大堆工作的C++代码,我想编写Python绑定.我正在尝试使用Boost.Python,因为它似乎是让这个工作最简单的方法,但它不合作.这是我正在尝试构建的扩展模块的代码的一部分:

BOOST_PYTHON_MODULE(libpcap_ext) {
    using namespace boost::python;
    class_<PacketEngine>("PacketEngine")
        .def("getAvailableDevices", &PacketEngine_getAvailableDevices);
}
Run Code Online (Sandbox Code Playgroud)

Bjam似乎很痛苦并拒绝识别我的Pythonpath或允许我链接libpcap,所以我正在使用CMake.这是我的CMakeLists文件,可以导入和构建一切就好(按预期输出libpcap.so):

CMAKE_MINIMUM_REQUIRED(VERSION 2.8)
IF(NOT CMAKE_BUILD_TYPE)
  SET(CMAKE_BUILD_TYPE "DEBUG")
  #SET(CMAKE_BUILD_TYPE "RELEASE")
  #SET(CMAKE_BUILD_TYPE "RELWITHDEBINFO")
  #SET(CMAKE_BUILD_TYPE "MINSIZEREL")
ENDIF()

FIND_PACKAGE(Boost 1.55.0)
find_package(PythonLibs REQUIRED)
IF(Boost_FOUND)
  INCLUDE_DIRECTORIES("${Boost_INCLUDE_DIRS}" "${PYTHON_INCLUDE_DIRS}")
  SET(Boost_USE_STATIC_LIBS OFF)
  SET(Boost_USE_MULTITHREADED ON)
  SET(Boost_USE_STATIC_RUNTIME OFF)
  FIND_PACKAGE(Boost 1.55.0 COMPONENTS python)

  ADD_LIBRARY(pcap_ext MODULE PacketWarrior/pcap_ext.cc PacketWarrior/PacketEngine.h PacketWarrior/PacketEngine.cc PacketWarrior/Packet.h PacketWarrior/Packet.cc)
  TARGET_LINK_LIBRARIES(pcap_ext pcap)
  TARGET_LINK_LIBRARIES(pcap_ext ${Boost_LIBRARIES} ${PYTHON_LIBRARIES})
ELSEIF(NOT Boost_FOUND)
  MESSAGE(FATAL_ERROR "Unable to find correct Boost version. Did you set BOOST_ROOT?")
ENDIF()

ADD_DEFINITIONS("-Wall")
Run Code Online (Sandbox Code Playgroud)

我的pcap.py文件试图利用该模块:

import libpcap_ext
engine = libpcap_ext.PacketEngine()
print engine.getAvailableDevices()
Run Code Online (Sandbox Code Playgroud)

但每当我尝试运行该模块时,我都会收到以下错误:

Traceback (most recent …
Run Code Online (Sandbox Code Playgroud)

boost-build boost-python

7
推荐指数
1
解决办法
3140
查看次数

在执行bcp之后构建依赖的boost库

所以我使用了一组boost库,但是包含文件的绝对数量使得检查一个干净的副本真的很慢.我敢肯定大多数使用svn的boost的人已经注意到了这一点.我google了一会儿,从boost中找到一个很好的实用程序,bcp它只会将依赖的头文件复制到我指定的目录中.所以,我想要做的是在svn中提供最少数量的头文件,并允许开发人员根据需要编译所有内容.第一步是复制必要的头文件并检查所有必要的预编译库.下一步是抛弃预编译的库,并使其成为我正在为我的项目使用的任何构建系统的预构建步骤(在我的情况下,Visual Studio,但make也会非常好).我的问题是这个

有人知道如何构建标题子集所需的库吗?

我正在按照这个方针做一个bcp

bcp.exe --scan C:\path\to\my\files\main.cpp C:\path\to\my\files\someOtherCppFilesToo.cpp C:\path\to\reduced\boost
Run Code Online (Sandbox Code Playgroud)

互联网似乎认为我可以做这样的事情

cd C:\path\to\reduced\boost
bootstrap.exe
b2.exe
Run Code Online (Sandbox Code Playgroud)

现在的问题是我无法弄清楚是否有某种方法可以复制compile/bootstrap/jam /无论配置如何,以便boost.build和bootstrap知道如何配置/编译所有内容.我显然不想从boost目录中复制每个文件,因为这会破坏减少boost包含的整个目的.

boost bootstrapper boost-build

7
推荐指数
1
解决办法
295
查看次数

6
推荐指数
1
解决办法
4617
查看次数

错误LNK1104:无法打开文件'libboost_thread-vc100-mt-gd-1_55.lib'

我正在尝试将boost线程的共享库链接到我的应用程序中.

系统:Windows8

IDE:Visual Studio 2010

我使用以下方法构建boost库:

b2 --with-thread --build-type=complete link=shared
Run Code Online (Sandbox Code Playgroud)

我可以看到

boost_thread-vc100-mt-gd-1_55.dll
boost_thread-vc100-mt-gd-1_55.lib
Run Code Online (Sandbox Code Playgroud)

和stage/lib目录中的其他文件

我在链接器选项中添加了"附加库目录和输入"的路径:

其他图书馆馆藏: C:/boost_1_55_0_dyn/stage/lib

输入: C:\boost_1_55_0_dyn\stage\lib\boost_thread-vc100-mt-gd-1_55.lib

我不知道为什么在地球上Visual Studio正在寻找libboost_thread-vc100-mt-gd-1_55.lib.我没有在属性或任何地方的任何地方提到libboost_thread-vc100-mt-gd-1_55.lib.我甚至搜索项目中的所有文件和文件夹,libboost_thread-vc100-mt-gd-1_55.lib在任何地方都没有提到.

boost linker-errors dynamic-linking visual-studio-2010 boost-build

6
推荐指数
1
解决办法
1万
查看次数

如何更改boost释放变体以使用cxxflags = -O2?

在我的机器上,默认情况下,variant = release的cxxflags是-O3.
我需要将它改为-O2.请告知如何继续.

如果有人可以就此提出建议,我也可以定义一个新变种.

boost boost-build bjam

5
推荐指数
1
解决办法
1452
查看次数

Boost Build,无法找到文件或目标 x

我有一个 Jamroot 文件,看起来有点像这样;

project foo ;

alias bar ./src/path/to/bar//bar
build-project bar ;
Run Code Online (Sandbox Code Playgroud)

总是给出烦人的错误

error: Unable to find file or target named
error:     '/foo//bar/'
error: referred from project at
error:     '.'
Run Code Online (Sandbox Code Playgroud)

运行与;

bjam --debug-building
building project Jamfile</home/chris/code/foo>  ('object(project-target)@163') with
{.. as above ...}
Run Code Online (Sandbox Code Playgroud)

根本没有帮助。

如果我将目录更改为文件夹并输入 bjam,则项目的该部分将完美构建。

作为解决方法,我有一个脚本可以在所有文件夹中执行此操作,但我很想知道为什么“正确”的方法不起作用。

我正在使用以下版本的 bjam

bjam --version
Boost.Build V2 (Milestone 12)
Boost.Jam 03.1.16
Run Code Online (Sandbox Code Playgroud)

非常感谢

boost-build

5
推荐指数
1
解决办法
2914
查看次数

C++ 测试编译错误

我是一名学生,我正在尝试为作业编写并运行一些测试代码,以便在提交作业之前对其进行检查。我现在要做的是测试我的代码是否正确阻止了值语义。在我的作业中,我为每个类声明了自己的私有复制构造函数和赋值运算符,但没有定义,因此什么也不做。当在我的测试程序中调用它们时,我收到了像我预期的那样的编译错误。像这样的东西:

错误:'myClass::myClass(const &myClass)' 是私有的'

错误:“myClass& myClass::operator=(const myClass&)”是私有的

有没有办法使用 try/catch 以便我的测试代码可以编译并运行,但告诉我这些错误确实发生了?我试过了:

myClass obj1(...);
myClass obj2(...);
try{
  obj1 = obj2;
  throw 1;
}
catch(int e){
  assert(e==1);
}
Run Code Online (Sandbox Code Playgroud)

但编译器仍然给我上面的错误。这些不是“例外”吗?他们不会触发投掷吗?

如果我正确理解 try/catch,它会处理运行时错误,而不是我上面遇到的那种错误,对吗?

经过更多研究后,似乎没有(简单)方法可以在 C++ 中本地测试某些编译错误(现在我想起来,这对于大多数语言来说可能都是如此)。我读过一篇文章,建议用脚本语言编写一些测试代码,尝试编译 C++ 代码片段并检查是否有任何错误,另一篇文章建议使用 Boost.Build。

做我想做的事情的最简单/最好的方法是什么?

我查看了 Boost.Build 的文档,它有点超出我的理解范围。如果我使用它,我将如何测试文件(例如“test.cpp”)的编译,以及如何处理“test.cpp”发生的特定编译错误?

感谢您的帮助!

PS这是我的第一篇文章,希望我已经做了“足够”的研究,并且正确地完成了其他所有事情。抱歉,如果我没有这样做。

c++ unit-testing boost-build

5
推荐指数
1
解决办法
4296
查看次数

无法添加定义来增强构建

我正在尝试使用 boost buildsystem 构建 boost 序列化/文件系统/系统的调试版本。这是我使用的:

  b2 serialization filesystem system variant=debug link=static threading=multi
  runtimelink=static define=_HAS_ITERATOR_DEBUGGING=0 toolset=msvc-11.0
Run Code Online (Sandbox Code Playgroud)

但是,当我在调试 Visual Studio 项目中包含该库时,我仍然会收到如下错误:

(basic_iarchive.obj) : error LNK2038: mismatch detected for '_ITERATOR_DEBUG_LEVEL': value '2' doesn't match value '0' in Game.obj
Run Code Online (Sandbox Code Playgroud)

这让我相信我在增强版本中的“定义”没有任何效果。正确的语法是什么?我找不到任何例子,文档也没有提及任何关于此事的内容。

编辑:我想强制要求在我的 boost 构建中定义 _HAS_ITERATOR_DEBUGGING=0

c++ boost boost-build visual-studio-2012

5
推荐指数
1
解决办法
2866
查看次数

在 Windows 上构建 boost 时出错“#error“Not ARM””和“错误:没有最佳替代方案”

我正在使用 mingw 在 Windows 上构建 boost,并收到诸如“#error“Not ARM””或“错误:没有...的最佳替代方案”之类的错误。这些错误是我应该担心的还是只是测试它所构建的系统?默认输出中有很多噪音,但下面是输出的压缩版本。谢谢

...found 13 targets...
...updating 5 targets...
common.mkdir bbuild\boost\bin.v2\libs\context
common.mkdir bbuild\boost\bin.v2\libs\context\config
common.mkdir bbuild\boost\bin.v2\libs\context\config\gcc-mingw-4.8.1
common.mkdir bbuild\boost\bin.v2\libs\context\config\gcc-mingw-4.8.1\debug
gcc.compile.c++ bbuild\boost\bin.v2\libs\context\config\gcc-mingw-4.8.1\debug\32.o
...updated 5 targets...
Performing configuration checks

    - 32-bit                   : yes
...found 2 targets...
...updating 1 target...
gcc.compile.c++ bbuild\boost\bin.v2\libs\context\config\gcc-mingw-4.8.1\debug\arm.o
E:\boost_1_54_0_win\libs\context\config\arm.cpp:12:2: error: #error "Not ARM"
 #error "Not ARM"
  ^

    "g++"  -ftemplate-depth-128 -O0 -fno-inline -Wall -g  -DBOOST_ALL_NO_LIB=1  -I"." -c -o "bbuild\boost\bin.v2\libs\context\config\gcc-mingw-4.8.1\debug\arm.o" "E:\boost_1_54_0_win\libs\context\config\arm.cpp"

...failed gcc.compile.c++ bbuild\boost\bin.v2\libs\context\config\gcc-mingw-4.8.1\debug\arm.o...
...failed updating 1 target...
    - arm                      : no
...found 2 targets...
...updating 1 target...
gcc.compile.c++ …
Run Code Online (Sandbox Code Playgroud)

windows boost mingw boost-build

5
推荐指数
1
解决办法
1493
查看次数