繁体   English   中英

构建共享库时,G ++和clang ++与标准库不兼容?

[英]G++ and clang++ incompatibility with standard library when building shared libraries?

如果我的文件clang.cpp包含:

#include <map>
void myfunc() {
    std::map<int, int> mymap;
    const int x = 20;
    myfoo[x] = 42;
}

和main.cpp包含:

void myfunc();
int main() { myfunc(); }

编译clang++ -g clang.cpp -shared -fPIC -o libclang.so -stdlib=libstdc++ -std=c++11clang++ -g main.cpp -L -Wl.,-rpath=. -lclang -lstdc++ -o a.out -stdlib=libstc++ -std=c++11 clang++ -g main.cpp -L -Wl.,-rpath=. -lclang -lstdc++ -o a.out -stdlib=libstc++ -std=c++11可以正常运行。

但是,如果我添加gcc.cpp包含:

#include <tuple>
template std::pair<int const, int>::pair(std::piecewise_construct_t, std::tuple<int const&>, std::tuple<>);

然后使用g++ -g gcc.cp -shared -fPIC -o libgcc.so将其编译为共享库,并将链接命令更改为clang++ -g main.cpp -L -Wl.,-rpath=. -lgcc -lclang -stdlib=libstdc++ -std=c++11 -o a.out clang++ -g main.cpp -L -Wl.,-rpath=. -lgcc -lclang -stdlib=libstdc++ -std=c++11 -o a.out ,然后运行./a.out将分段故障。

我不知道该怎么做,因为当使用相同的c ++标准库时,clang和gcc应该兼容ABI。 我的版本是ubuntu随附的clang的3.6.2,gcc的5.2.1。

给定

int f(std::tuple<const int &> t){
  return std::get<0>(t);
}

lang声生成

f(std::tuple<int const&>):                    # @f(std::tuple<int const&>)
        movl    (%rdi), %eax
        retq

当GCC产生时

f(std::tuple<int const&>):
        movq    (%rdi), %rax
        movl    (%rax), %eax
        ret

换句话说,Clang期望元组本身通过寄存器传递,而GCC期望地址将在寄存器中传递(并且元组在堆栈上传递)。

混合搭配,您将获得“有趣”的结果。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM