跨项目引用Jamfile目标失败:相对源文件路径混淆问题求助
问题排查与解决
问题原因
你遇到的问题源于Boost Build(Jamfile)处理跨项目依赖时的路径上下文切换:
- 在LibB的Jamfile中,
path.glob-tree src : *.cpp返回的是相对当前目录的路径(比如src/b_object.cpp) - 当你把这些相对路径的源文件和
../LibA//LibA/<link>static一起作为LibB的依赖时,Boost Build会错误地将这些相对路径放到LibA项目的上下文下去解析——因为../LibA//LibA指向的是LibA项目的目标,Boost Build会切换到LibA的项目根目录查找路径,自然找不到属于LibB的src/b_object.cpp。
解决方案
需要将LibB的源文件路径转换为相对于自身项目根的绝对路径,避免被其他项目上下文干扰,以下是几种可行方案:
方案1:基于项目根路径生成绝对路径
修改LibB/jamfile代码,通过project.current().path获取当前项目根路径,拼接生成源文件的绝对路径:
import path ; import project ; # 获取LibB项目的根路径 LOCAL_PROJECT_PATH = [ project.current().path ] ; # 生成基于项目根的绝对路径源文件列表 SOURCES = [ path.glob-tree $(LOCAL_PROJECT_PATH)/src : *.cpp ] ; lib LibB : $(SOURCES) ../LibA//LibA/<link>static ;
方案2:直接将相对路径转为绝对路径
使用path.make-absolute把glob-tree返回的相对路径转为绝对路径:
import path ; SOURCES = [ path.glob-tree src : *.cpp ] ; # 将每个相对路径转为绝对路径 SOURCES = [ path.make-absolute $(SOURCES) [ path.pwd ] ] ; lib LibB : $(SOURCES) ../LibA//LibA/<link>static ;
方案3:使用Boost Build原生glob规则
直接用Boost Build原生的glob规则(无需path模块),它默认基于当前项目根解析路径,不会出现跨上下文问题:
# 递归遍历src目录下所有cpp文件 SOURCES = [ glob src/**.cpp ] ; lib LibB : $(SOURCES) ../LibA//LibA/<link>static ;
验证逻辑
修改后,LibB的源文件路径会被明确标记为属于自身项目的绝对路径,Boost Build处理依赖时不会再将其放到LibA的项目上下文查找,从而解决文件找不到的错误。
内容的提问来源于stack exchange,提问作者Gabriel Devillers
相关产品推荐
相关产品推荐

