Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

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

Open
vip666mylife999 opened this issue Jun 4, 2023 · 7 comments
Open

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

vip666mylife999 opened this issue Jun 4, 2023 · 7 comments
Assignees

Comments

@vip666mylife999
Copy link

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
Copy link
Owner

owent commented Jun 5, 2023

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

@owent owent self-assigned this Jun 5, 2023
@vip666mylife999
Copy link
Author

bash-shell/LLVM&Clang Installer
/16.0/

@owent
Copy link
Owner

owent commented Jun 5, 2023

bash-shell/LLVM&Clang Installer /16.0/

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

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

@vip666mylife999
Copy link
Author

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

@owent
Copy link
Owner

owent commented Jun 5, 2023

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

@vip666mylife999
Copy link
Author

vip666mylife999 commented Aug 15, 2023

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

@owent
Copy link
Owner

owent commented Aug 16, 2023

可以用这种方式,把新版本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。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants