c++ - 在 libc++ 的 istringstream 的析构函数中未定义对运算符 delete 的引用

标签 c++ gcc clang clang++

我尝试构建 clang++从主干(〜3.7)有两种方式:通过gcc (4.8) 并通过(旧)clang++ (来自数据包管理器的 3.4 和 3.5)。它们都包含相同的步骤:

export CC=clang
export CXX=clang++
export CPLUS_INCLUDE_PATH="$CPLUS_INCLUDE_PATH:$HOME/llvm/projects/libcxxabi/include"

sudo apt-get install git

cd
git clone --single-branch --branch master --depth=1 http://llvm.org/git/llvm
cd llvm/projects/
git clone --single-branch --branch master --depth=1 http://llvm.org/git/libcxxabi
git clone --single-branch --branch master --depth=1 http://llvm.org/git/libcxx
git clone --single-branch --branch master --depth=1 http://llvm.org/git/compiler-rt
cd ../tools
git clone --single-branch --branch master --depth=1 http://llvm.org/git/clang
git clone --single-branch --branch master --depth=1 http://llvm.org/git/clang-tools-extra extra
git clone --single-branch --branch master --depth=1 http://llvm.org/git/lld
git clone --single-branch --branch master --depth=1 http://llvm.org/git/lldb
git clone --single-branch --branch master --depth=1 http://llvm.org/git/polly

sudo apt-get install python-dev libedit-dev libncurses-dev swig libgmp-dev libgmp3-dev dh-autoreconf libunwind8 libunwind8-dev cmake

cd
cd llvm/tools/polly/utils
mkdir -p ~/build-cloog
bash checkout_cloog.sh ~/build-cloog
mkdir -p ~/build-isl
bash checkout_isl.sh ~/build-isl
cd ~/build-isl/
./configure
make
sudo make install
cd ~/build-cloog/
./configure --with-isl=system
make
sudo make install

cd
mkdir build-llvm
cd build-llvm
bash ../llvm/configure --enable-optimized --disable-assertions --enable-libcpp --enable-jit --enable-targets=x86,x86_64 --enable-polly --enable-cxx1y --with-gmp=/usr/local --with-isl=/usr/local --with-cloog=/usr/local --with-binutils-include=/usr/include
make -j`nproc`
sudo make install

对于 CC=clangCXX=clang++我在链接包含 std::istringstream 的简单示例时出错实例化:

#include <sstream>

#include <cstdlib>

int
main()
{
        std::istringstream iss("1.1");
        double x;
        iss >> x;
        return EXIT_SUCCESS;
}

错误:

user@ubuntu:~$ clang++ -stdlib=libc++ -std=gnu++1z -Ofast -march=native test.cpp -o /tmp/test
/tmp/test-785a74.o: In function `std::__1::basic_istringstream<char, std::__1::char_traits<char>, std::__1::allocator<char> >::~basic_istringstream()':
test.cpp:(.text._ZNSt3__119basic_istringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEED0Ev[_ZNSt3__119basic_istringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEED0Ev]+0x5b): undefined reference to `operator delete(void*, unsigned long)'
/tmp/test-785a74.o: In function `virtual thunk to std::__1::basic_istringstream<char, std::__1::char_traits<char>, std::__1::allocator<char> >::~basic_istringstream()':
test.cpp:(.text._ZTv0_n24_NSt3__119basic_istringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEED0Ev[_ZTv0_n24_NSt3__119basic_istringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEED0Ev]+0x69): undefined reference to `operator delete(void*, unsigned long)'
/tmp/test-785a74.o: In function `std::__1::basic_stringbuf<char, std::__1::char_traits<char>, std::__1::allocator<char> >::~basic_stringbuf()':
test.cpp:(.text._ZNSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEED0Ev[_ZNSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEED0Ev]+0x26): undefined reference to `operator delete(void*, unsigned long)'
clang: error: linker command failed with exit code 1 (use -v to see invocation)

但是错误不会发生,如果CC=gccCXX=g++ .链接器是 ld来自 GNU Binutils在这两种情况下。

来自 #include <iostream> 的对象的示例感谢不存在这样的问题。

错误的原因是什么?我可以在不重建整个的情况下修复它吗 clang/llvm项目树?

最佳答案

clang 主干最近发生了变化。编译器不再发出 sized operator delete 的弱定义(参见 commit 229241 )。无论如何发出定义的标志 (-fdef-sized-delete) 后来在 commit 229597 中重命名了.

您必须使用 -fdefine-sized-deallocation 标志编译您的程序,以便 clang 发出大小运算符删除。这应该可以修复您的链接错误。

关于c++ - 在 libc++ 的 istringstream 的析构函数中未定义对运算符 delete 的引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28526246/

相关文章:

c++ - 来自 EPEL 的 Amazon Linux 上的 Clang 无法找到 C++ header 或库

c++ - 绑定(bind)错误 "The C++ Programming Language [4th Edition] - Bjarne Stroustrup"

c++ - Affdex 'opencv-webcam-demo' 在 Ubuntu 16.04 中崩溃

c - main.c 中定义的宏在另一个包含的文件中不可见

c - 矩阵乘法的自动向量化

c - 为什么我的for循环不遍历我的char_array?

ruby-on-rails - pg 1.0.0 `fatal error: ' libpq-fe.h' 文件未找到`

c++ - 使用访问者模式对事件进行排序

c++ - std::move 更改变量地址?

c++ - 为项目启用 clang