Ubuntu 22.04 LTS编译喷注物理项目时出现fastjet::Recluster虚表未定义引用错误
看起来你碰到的是跨平台编译时常见的C虚表链接问题,虽说代码和依赖版本都一致,但Ubuntu的gcc链接器和Mac的clang链接器在处理符号解析、C标准支持上有不少细微差别。结合你用到的fastjet-contrib里的RecursiveTools库,我给你几个针对性的排查和解决方向:
重新编译fastjet-contrib,匹配C++标准
Ubuntu默认的gcc可能没有启用你项目需要的C版本(比如C11或更高),而Mac的clang通常默认支持更现代的标准。虚表生成异常很多时候和C标准不匹配有关。重新编译fastjet-contrib时,记得显式指定C标准:./configure --fastjet-config=/path/to/your/fastjet/bin/fastjet-config --cxxflags="-std=c++17" make clean && make && make install这里的
c++17可以换成你项目实际使用的版本,比如c++11,确保和你编译主项目时的标准一致。调整Makefile的库链接顺序
C++链接器对库的顺序非常敏感,依赖库必须放在被依赖库的后面。RecursiveTools依赖Fastjet的符号,所以你的Makefile里库的顺序应该是先Fastjet,再RecursiveTools:LIBS = -lfastjet -lRecursiveTools如果之前的顺序反过来,链接器会先处理RecursiveTools,此时还没加载Fastjet的符号,就会出现虚表未定义的错误。
显式指定fastjet-contrib的头文件和库路径
有时候Ubuntu的系统库路径和Mac不同,哪怕你觉得路径正确,也可以在编译命令里显式指定,避免链接器找不到库:CXXFLAGS += -I/path/to/fastjet-contrib/include LDFLAGS += -L/path/to/fastjet-contrib/lib检查编译器版本与编译选项
Ubuntu 22.04默认的gcc是11.x版本,和Mac的clang在虚函数处理上可能有差异。确保你编译主项目时也显式指定了C++标准,在Makefile里加上:CXXFLAGS += -std=c++17
你可以先从重新编译fastjet-contrib和调整链接顺序这两个方向入手,这两个是最常见的解决这类问题的方法。
备注:内容来源于stack exchange,提问作者Shivangi Singh

