主体流程按照文档来就行,先编译Boost.Build,然后用生成的b2来编译剩余的部分。

主要是在编译Boost.Python遇到了问题。虽然在编译时传入--build-type=complete参数也包含了对Python模块的编译,但是仔细阅读文档可以发现,这个complete指的是尽可能完整,也就是说,如果某些模块编译出错了,b2会放弃编译该模块,而不是发出严重错误的警告——“反正我是尽力而为嘛”。恰好在我的情景下,Boost.Python就是其中之一。网上对于如何编译这个库的讨论很少,在StackOverflow上也只是找到了少量的讨论,感觉似乎要么是没人整这些东西,要么人人都是专家= =

后来发现在Boost的文档中提到,有一个配置文件叫user-config.jam,在这里进行Python的配置。先贴一个我的配置:

using python
    : 3.6
    : C:\\Program\ Files\\Python36\\python.exe
    : C:\\Program\ Files\\Python36\\include
    : C:\\Program\ Files\\Python36\\libs
    : <toolset>msvc
    ;

但是这个配置文件的位置有讲究,说是要放在家目录下(参见 https://boostorg.github.io/build/manual/develop/index.html#bbv2.overview.configuration )。如果在Windows下不想配置家目录,那么就需要使用--user-config=参数来显式指定配置文件。有些教程说将这个文件放在编译的根目录下也行(未经尝试)。

编译完成以后,目录结构还是保持了类似源文件的文件夹结构,因而若是要一个个手动添加库文件可以说是一项繁重的工作。这里放一段把所有动态/静态库文件提取出来,放在同一个文件夹下的Python代码片段供参考:

import shutil
import os

dest = './lib'
try:
    shutil.rmtree(dest)
except Exception as e:
    pass
os.makedirs(dest)

def explore(prefix: str):
    if prefix == './lib':
        return

    if os.path.isdir(prefix):
        entries = os.listdir(prefix)
        for entry in entries:
            explore(prefix + '/' + entry)
    elif prefix.split('.')[-1] in ['lib', 'dll'] and ('vc142-mt-x64' in prefix or 'vc142-mt-gd-x64' in prefix):
        shutil.copy2(prefix, dest)

if __name__ == '__main__':
    '''Extract all boost libraries. @Esper'''
    explore('.')

将该代码片段放在libs目录下执行,即可在名为lib的新子目录中找到所有提取的库文件。同时,对于explore函数中的某些判断条件需要进行合适的修改,比如vc版本,编译条件或者系统位数等,还请读者根据实际情况调整。

标签: none

添加新评论