【问题标题】:Boost bjam Jamfile import statementBoost bjam Jamfile 导入语句
【发布时间】:2021-08-11 19:17:29
【问题描述】:

我有一个通过 bjam (V2) 实用程序构建的复杂 C++ 应用程序(以及一些用于引导环境的 shellscript)

在 Jamroot 文件中,有“include(s)”,其中一些被记录为内置,但很多看起来像“自定义”的东西。

我正在尝试添加单元测试,但我很难理解 bjam 实际在做什么的生命周期。官方错误是链接器未能“找到”真正应该可见的库,因为它们在编译时使用,我确实在 Jamroot 中看到了它们的“提及”。 Soo 我不确定是否需要在单元测试目标中明确声明某些内容以轻推它还是什么?我必须遵循一些特殊的“命令”吗?有人对此有任何经验吗?基本上我在我的代码所在的同一个目录中有一堆 unittest_someclass.cpp 文件,我希望它们作为构建的一部分进行编译/运行。每个测试都有自己的 main 函数来设置和运行测试。

我以为我所要做的就是import test; 并且所有要求都将从父 Jamroot 继承,但看起来情况并非如此?

Boost 版本是 1.53

这是我在 Jamfile 中添加的代码示例

 custom_lib_target my_project_lib
     :
   /boost//headers
   /some_other_stuff//etc
   ...
     :
    <warn_extra>off
    ...etc...
     ;

   #my unit_test target 
 exe boost_tester
   :
  my_project_lib
   ;

 unit-test test_all
 : [ glob unittest*.cpp ] boost_tester
 ;     

【问题讨论】:

  • boost-build 没有什么神奇之处。如果你需要一些特殊的规则,你应该导入一些实现它的 jam 文件。 boost-build 的典型安装将在某个地方有一个 /usr/share/boost-build 目录,其中包含各种有用的 jam 文件。
  • 特别是,要使用 unit-test 规则(已弃用),您应该 import testing ; (github.com/boostorg/build/blob/develop/src/tools/testing.jam)
  • 我有导入,但是当我运行单元测试目标时,我从 ld: libwhatever.so 得到很多错误,需要 /usr/local/whatever not foudn 尝试使用 -rpath 或 -rpath -link,我在父 Jamroot 中声明了这些,它可以构建所有内容,但是当我尝试构建子项目时,我想我必须明确提及它...
  • 显然您希望根据需要传递所有相关的编译和链接标志。
  • 这正是我想弄清楚的方法

标签: c++ boost bjam


【解决方案1】:

所以问题不在于 boost 测试框架(尽管这可以更好地记录),问题在于链接器无法找到要链接的各种库的调试变体。 (阅读警告会有所帮助。)因此,虽然从 root 运行该构建对项目有效,但对于子项目却失败了,例如在尝试单独运行单元测试时。我能够通过硬编码(不理想,但它有效)调试变体的路径来修复它,如下所示:

lib my_lib : : &lt;file&gt;/path/to/my_lib-d.so &lt;variant&gt;debug

然后你像这样在你的测试构建中使用它

unit-test my_test : [ glob unittest*.cpp ] my_lib : ;

目前我对 Boost.Build V2 还不够熟悉,所以不知道如何让它更“优雅”

【讨论】:

    猜你喜欢
    • 2016-06-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多