我目前正在将我的一个项目移植到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++代码,我想编写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库,但是包含文件的绝对数量使得检查一个干净的副本真的很慢.我敢肯定大多数使用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包含的整个目的.
如何构建提升1.45通用二进制文件?在豹/雪豹?
我正在尝试将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
在我的机器上,默认情况下,variant = release的cxxflags是-O3.
我需要将它改为-O2.请告知如何继续.
如果有人可以就此提出建议,我也可以定义一个新变种.
我有一个 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)
非常感谢
我是一名学生,我正在尝试为作业编写并运行一些测试代码,以便在提交作业之前对其进行检查。我现在要做的是测试我的代码是否正确阻止了值语义。在我的作业中,我为每个类声明了自己的私有复制构造函数和赋值运算符,但没有定义,因此什么也不做。当在我的测试程序中调用它们时,我收到了像我预期的那样的编译错误。像这样的东西:
错误:'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这是我的第一篇文章,希望我已经做了“足够”的研究,并且正确地完成了其他所有事情。抱歉,如果我没有这样做。
我正在尝试使用 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
我正在使用 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) boost-build ×10
boost ×6
c++ ×3
mingw ×2
windows ×2
bjam ×1
boost-python ×1
bootstrapper ×1
macos ×1
osx-leopard ×1
unit-testing ×1