同时构建32位和64位的boost库?

28
选项“--address-model=32,64”会构建32位和64位库吗?还是必须进行两次单独的构建?

2
如果你正在编译i386 Mac OS并且遇到了问题,而且在这里也没有找到解决方法,那么你可能已经快要崩溃了(就像我一样),请添加这个标志:architecture=x86 - Mazyod
1
我有一个类似的问题。我可以构建32位和64位的boost库(下面答案中的32_64建议在Windows上的1.57.0版本上不起作用),并将它们存储在不同的lib目录中,但是在引用这些库时,最好的或建议的组织方法是什么?我希望能够构建32位和64位项目,而无需在环境变量之间切换(例如在使用cmake时)。 - StarShine
3个回答

23

做:

b2 address-model=32,64

或者...

b2 address-model=32,64,32_64
根据工具集和平台支持的不同,第一种情况下可以处理并生成32位和64位目标。在OSX上,使用"darwin"工具集可能会生成32位、64位和32 + 64通用目标(很可能只有这种情况)。通过"工作",我是指我在OSX上使用"darwin"工具集尝试了我的Boost库,因此我怀疑您的语法有误,即不要使用"--name=values"作为选项,而是使用"name=values"作为需求规格。

2
感谢您对语法的澄清!也许我有点挑剔,但是当语法不正确时,b2不应该给出错误(至少警告)吗?我想这个故事的寓意就是要小心使用b2!! - PopcornKing
从 b2 实现的角度来看,语法不正确并不是一件容易的事情。它会看到一个正确语法的选项(任何以“-”开头但它自己无法识别的选项),然后将其传递给 Jamfiles。这些文件以模块化的方式查看选项,并决定它们无法处理。因此,没有地方可以决定该选项是否有效。也就是说,该选项最终被忽略了。这是 b2 CLI 不是一个封闭的语法集合的结果。 - GrafikRobot
20
当你要提取库时,你可能会遇到问题,因为32位和64位的库名称是相同的。你需要运行b2两次,一次使用“--stagedir=stage32 address-model=32”参数,另一次使用“--stagedir=stage64 address-model=64”参数。请注意不改变原意。 - mheyman
1
32_64选项在哪里有文档记录?我无法找到它的任何信息(而且我不相信在Windows上实际上可以将它们存储在同一个lib/dll中)。 - StarShine
1
@StarShine 这在 源代码darwin 工具集注释 中都有提到。就像我在回答中所说的那样.. “很可能只在使用 darwin 工具集的 OSX 上。” - GrafikRobot

11
文档中指出(重点在我):

“显式请求生成32位64位代码。”

请注意,它并没有说“一个或多个”或“至少一个”,而是说要么是......要么是,这意味着在我的解读中是异或,您的经验证实了这一点。
允许值列表中的逗号只是为了分隔允许值集合中的两个项目。

文档还指出:“逗号仅在该特性具有固定值集时具有特殊含义,因此bjam include=static,shared不会被特殊处理。” 对于address-model,32位和64位似乎是固定的。感谢您的回复。 - PopcornKing
1
@PopcornKing - 我认为特定标志上的“要么...要么”评论优先于任何其他适用的一般备注。 - Flexo

6
我最终做了以下操作:
  • 将32位的lib/dll构建文件存储在一个名为/lib32的单独文件夹中
  • 将64位的lib/dll构建文件存储在一个名为/lib64的单独文件夹中

两者最好都在boost已经检查的搜索路径中,例如stage安装文件夹。

然后,在头部的搜索路径被组装完成之后,我添加了以下代码块(需要编辑FindBoost.cmake文件,该文件位于CMake安装文件夹下的share/cmake-3.1/Modules/文件夹中):

开始查找boost库


...

if(Boost_LIBRARY_DIR)

...

endif()

#generate 32 and 64 bit paths
if(WIN32)
    if(CMAKE_CL_64)
        #message("Finding BOOST on windows platform (64 bit)")
        SET(BOOST_libdir_suffix_gen "64")
    else()
        #message("Finding BOOST on windows platform (32 bit)")
        SET(BOOST_libdir_suffix_gen "32")
    endif()

    list(APPEND _boost_LIBRARY_SEARCH_DIRS_PLATFORMS "")
    foreach(SEARCH_DIR_NOPLATFORM ${_boost_LIBRARY_SEARCH_DIRS})
        list(APPEND _boost_LIBRARY_SEARCH_DIRS_PLATFORMS ${SEARCH_DIR_NOPLATFORM}${BOOST_libdir_suffix_gen})        
    endforeach()
    foreach(SEARCH_DIR_PLATFORM ${_boost_LIBRARY_SEARCH_DIRS_PLATFORMS})
         list (APPEND _boost_LIBRARY_SEARCH_DIRS ${SEARCH_DIR_PLATFORM})
    endforeach()
else()
    # no generation required (?)
endif()  

它将重新将所有现有的lib目录附加到boost库搜索路径中,并带有64位或32位扩展标记。这将选择正确的目标库进行链接,您可以安全地重新生成任何其他依赖于cmake库(如CGAL)的32位或64位目标构建,而无需重置boost依赖路径。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接