我只是想编译boost.python的"hello world"示例而不使用所有的bjam魔法.我的boost.python安装工作正常,我用bjam成功构建了示例并通过了测试套件.
现在,对于我的项目,我需要在普通的Make环境中使用所有这些东西.我不想移植到另一个构建工具.
所以我的天真方法当然只是将包含路径指向正确的标题并链接到正确的库.我将boost python构建为system-layout,static,runtime-static,这意味着它只是一个驻留在/ usr/local/lib中的libboost_python.a.
不幸的是,我在生成的.so库中得到了未解析的外部符号.
这是我尝试从libs/python/example/tutorial/hello.cpp构建示例:
$ cat hello.cpp
// Copyright Joel de Guzman 2002-2004. Distributed under the Boost
// Software License, Version 1.0. (See accompanying file LICENSE_1_0.txt
// or copy at http://www.boost.org/LICENSE_1_0.txt)
// Hello World Example from the tutorial
// [Joel de Guzman 10/9/2002]
#include <boost/python/module.hpp>
#include <boost/python/def.hpp>
char const* greet()
{
return "hello, world";
}
BOOST_PYTHON_MODULE(hello_ext)
{
using namespace boost::python;
def("greet", greet);
}
$ g++ -I/usr/local/include -I/usr/include/python -fpic -c -o hello.o
hello.cpp
$ g++ -shared -Wl,-soname,"libhello.so" …Run Code Online (Sandbox Code Playgroud) 我正在尝试只构建一个boost库的子集.例如,我有这个代码:
TEST.CPP:
#include <boost/thread.hpp>
int main (){
return 0;
}
Run Code Online (Sandbox Code Playgroud)
然后我做
./bcp --scan test.cpp ~/dev/boost_compact/
Run Code Online (Sandbox Code Playgroud)
因此依赖项文件被复制到~/dev/boost_compact/boost.
然后,按照这个答案,我复制常规boost的根目录下的所有文件以及tools目录并运行
./bootstrap
./bjam
./bjam install
Run Code Online (Sandbox Code Playgroud)
这会将所有标头复制到目标目录,但不会构建/复制库.同样的一系列动作确实有效.我究竟做错了什么?
我正在尝试使用boost_1_55_0库,并且我不断遇到对jamfiles的引用.
什么是果酱文件?
为什么有bjam和jamfiles的多个版本?
这是我的项目结构:
MainFolder
- Jamroot.jam
- AnotherFolder
- libFolder
- Jamfile.jam
- cpp files
Run Code Online (Sandbox Code Playgroud)
我在其中一个cpp文件中有#ifdef.例:
#ifdef SOMEVALUE
Code
#endif
Run Code Online (Sandbox Code Playgroud)
我需要在Jamfile中使用#define编译cpp文件.因为,我有两种类型的可执行文件(一个使用#define,一个没有)我需要在Jamfile本身而不是cpp代码中执行此操作.
我尝试了以下,但不起作用(无法在#ifdef #endif块中找到定义):
lib libname : [ glob *.cpp ] : <link>static : <define>SOMEVALUE ;
Run Code Online (Sandbox Code Playgroud) 我需要使用bjam添加到编译器标志.所以要么我需要一种方法来附加到现有的标志 - 比如CXXFLAGS + =使用gmake的任何东西 - 或者我需要知道当前使用的cxxflags值所以我可以用我的添加替换它.
像往常一样,文档让我对bjam的复杂性感到惊讶,但没有能够对它做任何有用的事情.
我一直在使用boost.build或b2来构建项目.我正在尝试添加类似的C++ 11结构auto,begin但是b2 release使用Jamfile的目录中的标准调用无法识别这些.
我正在尝试为osx编译boost v1.55库,支持多线程.我的user-config.jam配置编译器如下:
using clang : osx
: xcrun clang -arch i386 -arch x86_64 -stdlib=libstdc++ -mmacosx-version-min=10.9
;
Run Code Online (Sandbox Code Playgroud)
我运行以构建库的命令如下:
./b2 -a -j8 toolset=clang-osx link=static threading=multi --with-thread
Run Code Online (Sandbox Code Playgroud)
但是,生成的库具有以下格式:libboost_.a,而不是libboost_-mt.a
有没有人知道为什么省略'-mt'标签?
在安装了Visual Studio .NET 2003 SP1的开发机器Vista SP1上
- 使用boost 1.44.0我使用bootstrap.bat生成b2.exe和bjam.exe没有问题
- 使用boost 1.57.0我收到此错误消息时运行bootstrap.bat:
Building Boost.Build engine
Failed to build Boost.Build engine.
Please consult bootstrap.log for furter diagnostics.
Run Code Online (Sandbox Code Playgroud)
这是从cmd.exe或Visual Studio .NET 2003命令提示符发生的.
我在boostrap.log中有这些错误:
builtins.c(1885):错误C2065:'FSCTL_GET_REPARSE_POINT':未声明的标识符builtins.c
(1889):错误C2065:'IO_REPARSE_TAG_SYMLINK':未声明的标识符
builtins.c包含
#ifdef OS_NT
#include <windows.h>
#ifndef FSCTL_GET_REPARSE_POINT
/* MinGW's version of windows.h is missing this, so we need
* to include winioctl.h directly
*/
#include <winioctl.h>
#endif
#endif
Run Code Online (Sandbox Code Playgroud)
和FSCTL_GET_REPARSE_POINT在VS .NET 2003提供的winioctl.h中
我想OS_NT定义由于某种原因缺失了?
注意:Boost 1.57.0 windows文档 仍然引用VS .NET 2003
我正在开发一个C++项目,我想使用boost的序列化库.我从boost的主页下载并安装了最新的boost库.
当我尝试编译并运行boost的演示序列化示例时,我得到了各种各样的错误,如下所示:
/usr/local/include/boost/archive/detail/iserializer.hpp:173: undefined reference to `boost::archive::archive_exception::~archive_exception()'
./demo.o: In function `void boost::archive::detail::save_non_pointer_type<boost::archive::text_oarchive>::save_standard::invoke<bus_schedule::trip_info>(boost::archive::text_oarchive&, bus_schedule::trip_info const&)':
/usr/local/include/boost/archive/detail/oserializer.hpp:253: undefined reference to `boost::archive::detail::basic_oarchive::save_object(void const*, boost::archive::detail::basic_oserializer const&)'
./demo.o: In function `void boost::archive::save_access::end_preamble<boost::archive::text_oarchive>(boost::archive::text_oarchive&)':
/usr/local/include/boost/archive/detail/oserializer.hpp:83: undefined reference to `boost::archive::detail::basic_oarchive::end_preamble()'
./demo.o: In function `void boost::archive::detail::load_pointer_type<boost::archive::text_iarchive>::invoke<bus_route*>(boost::archive::text_iarchive&, bus_route*&)':
/usr/local/include/boost/archive/detail/iserializer.hpp:518: undefined reference to `boost::archive::detail::basic_iarchive::load_pointer(void*&, boost::archive::detail::basic_pointer_iserializer const*, boost::archive::detail::basic_pointer_iserializer const* (*)(boost::serialization::extended_type_info const&))'
./demo.o: In function `void boost::archive::detail::save_pointer_type<boost::archive::text_oarchive>::non_polymorphic::save<bus_route>(boost::archive::text_oarchive&, bus_route&)':
Run Code Online (Sandbox Code Playgroud)
我是C++的新手并且提升所以任何帮助都会受到赞赏.
谢谢
我希望为一个主要用C++编写的项目集成一个非平凡的跨平台构建系统.到目前为止,我已经评估了Cmake和Scons,虽然它们都代表了对(GNU)make的改进,但在我尝试使用这些工具的上下文中,这两种方法似乎都不优雅或透明.这让我进入了Boost Build(Bjam)并且我很受鼓舞,因为我的项目依赖于Boost,bjam应该可用于任何可行的目标平台.
我试图将代码覆盖整齐地集成到库的单元测试中,以便最终集成到构建服务器(如Jenkins)中,我遇到了困难.虽然我愿意接受Bjam最佳/标准练习的指导,但我认为我需要三种不同的"变体":
本质上,除了标准的调试和发布版本之外,我还想要一个专门用于收集覆盖数据的调试版本.
我需要使用(至少)g ++和msvc构建...并且只使用g ++的gcov开关.这意味着我的库目标需要与单元测试可执行目标不同的"compilerflags"...并且仅针对我的一个编译器套件...并且仅针对一个变体.
我不清楚如何最好地用Bjam实现这一点 - 但是,我怀疑,它应该是一个相当常见的用例.Bjam是否明确支持gcov覆盖率分析(可能使用lcov呈现结果)?如果没有,任何人都可以推荐一种支持上述(简化)方案的策略吗?