为什么g ++与-O3段错误与以下LLVM库代码

时间:2016-10-16 14:20:13

标签: c++ c++11 clang llvm

所以我想使用llvm::Twine字符串块类。

我有以下样本:

#include <llvm/ADT/Twine.h>
#include <iostream>

int main()
{
  llvm::Twine twine1 = llvm::Twine("aaaa") + "bbbb" + "cccc" + "dddd";
  llvm::Twine twine2 = llvm::Twine(twine1) + "dddd" + "eeee";
  std::cout << twine1.str() << std::endl;
  std::cout << twine2.str() << std::endl;

  return 0;
}

它与clang++合并-O3合并g++合并-O0合并,g++合并-O3。我尝试使用3.4-3.9中的不同版本的clang库,并尝试使用g++ 4.8.4g++ 4.8.5mingw-5.3.0

您需要llvm库并将代码与-lLLVMSupport -lLLVMCore以及llvm-config --ldflags

中的其他代码相关联

2 个答案:

答案 0 :(得分:5)

来自Twine documentation

  

Twine不能直接使用,也不应存储   实现依赖于存储指向临时指针的能力   堆栈对象,可以在语句结尾处解除分配。   Twines只能在参数中被接受为const引用,   当API希望接受可能连接的字符串时。

换句话说,Twine对象不拥有它的部分,所以它们在语句结束时被销毁。

正确的用法是:

#include <llvm/ADT/Twine.h>
#include <iostream>

void bar(const llvm::Twine& twine1, const llvm::Twine2& twine2){
    std::cout << twine1.str() << std::endl;
    std::cout << twine2.str() << std::endl;
}

void foo(const llvm::Twine& twine1){
    bar(twine1, twine1 + "dddd" + "eeee");
}

int main()
{
  foo(llvm::Twine("aaaa") + "bbbb" + "cccc" + "dddd");

  return 0;
}  

答案 1 :(得分:-1)

看起来您正在尝试使用gcc编译一些代码,并将其与使用不同编译器构建的库链接;即llvm

不同的编译器通常会使用不同的internal ABI。通常,由一个C ++编译器编译的代码不能与构建不同编译器的代码链接,除非有明确的ABI兼容性保证。 TMK,gcc和llvm之间没有。即使实际链接可能成功,结果也不会有定义的行为。

事实上,由一个版本的gcc构建的代码通常不能与使用不同版本的gcc构建的代码链接(许多版本的gcc确实具有某些ABI兼容性保证,但不能与其他所有版本的gcc一起使用)。 / p>

相关问题