owent / bash-shell

OWenT's Utils -- Bash&Shell branch
Other
109 stars 26 forks source link

Linking CXX executable bin/lld FAILED: bin/lld #7

Open vip666mylife999 opened 1 year ago

vip666mylife999 commented 1 year ago

lib/liblldELF.a(OutputSections.cpp.o):OutputSections.cpp:function void lld::elf::OutputSection::maybeCompress<llvm::object::ELFType<(llvm::support::endianness)1, false> >(): 错误: 对‘ZSTD_compressStream2’未定义的引用 lib/liblldELF.a(OutputSections.cpp.o):OutputSections.cpp:function void lld::elf::OutputSection::maybeCompress<llvm::object::ELFType<(llvm::support::endianness)0, false> >(): 错误: 对‘ZSTD_compressStream2’未定义的引用 lib/liblldELF.a(OutputSections.cpp.o):OutputSections.cpp:function void lld::elf::OutputSection::maybeCompress<llvm::object::ELFType<(llvm::support::endianness)1, true> >(): 错误: 对‘ZSTD_compressStream2’未定义的引用 lib/liblldELF.a(OutputSections.cpp.o):OutputSections.cpp:function void lld::elf::OutputSection::maybeCompress<llvm::object::ELFType<(llvm::support::endianness)0, true> >(): 错误: 对‘ZSTD_compressStream2’未定义的引用 collect2: 错误:ld 返回 1

owent commented 1 year ago

这是使用哪一个脚本产生的呢?

vip666mylife999 commented 1 year ago

bash-shell/LLVM&Clang Installer /16.0/

owent commented 1 year ago

bash-shell/LLVM&Clang Installer /16.0/

请问是在什么环境下执行的?(哪个发行版和版本?自带的编译器是什么版本?) 另外是否方便尝试copy 这个目录到里的所有文件到一个不包含 & 和空格等特殊符号的目录执行? 之前发现有些第三方库编译脚本对这些特殊符号适配有问题导致不能正常编译。

这里的文件结构因为已经被一些工具引用了所以没改。

vip666mylife999 commented 1 year ago

ubuntu18.04,编译器用的是按您的脚本编译的GCC12,脚本放在根目录下的名字为1的文件夹里的,前面都运行好好的,编译LLVM时快结束的时候出现该错误,剩35个模块未完成

owent commented 1 year ago

是不是你的本地环境安装了zstd开发包?有可能是llvm构建系统没有处理好目录查找,链接串了。 zstd是在编译gcc的时候编译的。我这里使用古老的centos 7都能编出来。ubuntu 近期没测试过如果是比较干净的环境应该也是没问题的。

vip666mylife999 commented 1 year ago

能否像undefined reference to ZSTD_compress and ZSTD_decompress #40,解决该问题?

owent commented 1 year ago

可以用这种方式,把新版本zstd的包含目录写进 CFLAGS 里, 把链接目录写进 LDFLAGS 里。编译GCC和编译Clang的脚本是独立的,并不太好假定一定用我的脚本编译GCC。下面使我们内部的工具链构建脚本可以参考下。

bash ./installer.sh -p "$INSTALL_PREFIX/gcc-$GCC_INSTALLER_VERSION"
if [[ -e "$INSTALL_PREFIX/gcc-latest" ]]; then
  rm -rf "$INSTALL_PREFIX/gcc-latest"
fi
ln -sf "$INSTALL_PREFIX/gcc-$GCC_INSTALLER_VERSION" "$INSTALL_PREFIX/gcc-latest"

if [[ "x$LD_LIBRARY_PATH" == "x" ]]; then
  export LD_LIBRARY_PATH="$TOOLS_INSTALL_PREFIX/lib64:$TOOLS_INSTALL_PREFIX/lib"
else
  export LD_LIBRARY_PATH="$TOOLS_INSTALL_PREFIX/lib64:$TOOLS_INSTALL_PREFIX/lib:$LD_LIBRARY_PATH"
fi

source $INSTALL_PREFIX/gcc-latest/load-gcc-envs.sh
ALL_LDFLAGS="-L$TOOLS_INSTALL_PREFIX/lib64 -L$TOOLS_INSTALL_PREFIX/lib"
ALL_LDFLAGS="$ALL_LDFLAGS -L$GCC_HOME_DIR/lib64 -L$GCC_HOME_DIR/lib"
ALL_LDFLAGS="$ALL_LDFLAGS -L$GCC_HOME_DIR/internal-packages/lib64 -L$GCC_HOME_DIR/internal-packages/lib"
ALL_CFLAGS="-I$TOOLS_INSTALL_PREFIX/include -I$GCC_HOME_DIR/internal-packages/include"
if [[ "x$PKG_CONFIG_PATH" == "x" ]]; then
  export PKG_CONFIG_PATH="$TOOLS_INSTALL_PREFIX/lib64/pkgconfig:$TOOLS_INSTALL_PREFIX/lib/pkgconfig:$GCC_HOME_DIR/internal-packages/lib64/pkgconfig:$GCC_HOME_DIR/internal-packages/lib/pkgconfig:$GCC_HOME_DIR/lib64/pkgconfig:$GCC_HOME_DIR/lib/pkgconfig"
else
  export PKG_CONFIG_PATH="$PKG_CONFIG_PATH:$TOOLS_INSTALL_PREFIX/lib64/pkgconfig:$TOOLS_INSTALL_PREFIX/lib/pkgconfig:$GCC_HOME_DIR/internal-packages/lib64/pkgconfig:$GCC_HOME_DIR/internal-packages/lib/pkgconfig:$GCC_HOME_DIR/lib64/pkgconfig:$GCC_HOME_DIR/lib/pkgconfig"
fi
PYTHON_INCLUDE_DIR="$(find "$GCC_HOME_DIR/include" -name Python.h)"
PYTHON_INCLUDE_DIR="$(dirname "$PYTHON_INCLUDE_DIR")"

# See https://stackoverflow.com/questions/42344932/how-to-include-correctly-wl-rpath-origin-linker-argument-in-a-makefile
GCC_RPATH_LDFLAGS="-Wl,-rpath=\$ORIGIN/../lib64:\$ORIGIN/../lib:$GCC_HOME_DIR/internal-packages/lib64:$GCC_HOME_DIR/internal-packages/lib:$GCC_HOME_DIR/lib64:$GCC_HOME_DIR/lib"
export ALL_LDFLAGS="$ALL_LDFLAGS $GCC_RPATH_LDFLAGS"
if [[ "x$LDFLAGS" == "x" ]]; then
  export LDFLAGS="$GCC_RPATH_LDFLAGS"
else
  export LDFLAGS="$LDFLAGS $GCC_RPATH_LDFLAGS"
fi
export ORIGIN='$ORIGIN'

# 编译其他第三方库的时候导出 env CFLAGS=$ALL_CFLAGS, 比如

# distcc
cd /opt/setup/
download_file "$DISTCC_DOWNLOAD_URL" "distcc-$DISTCC_VERSION.tar.gz"
tar -axvf "distcc-$DISTCC_VERSION.tar.gz"

cd "distcc-$DISTCC_VERSION"
env LDFLAGS="${ALL_LDFLAGS//\$/\$\$}" \
  CFLAGS="$ALL_CFLAGS" ./configure --prefix=$TOOLS_INSTALL_PREFIX
env LDFLAGS="${ALL_LDFLAGS//\$/\$\$}" make -j || env LDFLAGS="${ALL_LDFLAGS//\$/\$\$}" make
env LDFLAGS="${ALL_LDFLAGS//\$/\$\$}" make install

上面不止设置了复用GCC内部使用的依赖库,还适配了pkg-config和python的查找,重设了RPATH。