Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/wcf/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 启用libc++/默认情况下,使用clang++;_Linux_Clang_Libc++ - Fatal编程技术网

Linux 启用libc++/默认情况下,使用clang++;

Linux 启用libc++/默认情况下,使用clang++;,linux,clang,libc++,Linux,Clang,Libc++,我按照说明从头开始安装了clang。之后,我按照说明使用libsupc++安装了libc++ 现在,每当我用clang和libc++编译并链接一个程序时,我都需要发出如下命令: clang++ -stdlib=libc++ -Wl,-rpath,/path/to/libcxx/lib <...> clang++-stdlib=libc++-Wl,-rpath,/path/to/libcxx/lib 有没有一种方法可以在默认情况下使用libc++来配置/编译clang,而不必每次都

我按照说明从头开始安装了
clang
。之后,我按照说明使用
libsupc++
安装了
libc++

现在,每当我用
clang
libc++
编译并链接一个程序时,我都需要发出如下命令:

clang++ -stdlib=libc++ -Wl,-rpath,/path/to/libcxx/lib <...>
clang++-stdlib=libc++-Wl,-rpath,/path/to/libcxx/lib

有没有一种方法可以在默认情况下使用
libc++
来配置/编译clang,而不必每次都在命令行上指定库和/或路径?将它放入
LD\u LIBRARY\u PATH
也不是首选选项,使用自定义包装器脚本也不是首选选项。

我可以考虑三种方法来实现它。第一种是针对使用Unix makefiles的单个项目,第二种是针对任意数量的项目,但需要编辑任意数量的文件以服务任意数量的用户,第三种是针对任意数量的项目或用户。您可能想跳到第三个选项,但其他选项适用于其他有类似需求的人

  • 这样做的一个好方法是使用makefile。这将使您只需键入
    make
    即可构建项目。如果您使用的是*nix,则不需要安装,大多数系统都附带了它。下面是一个示例makefile,它可以满足您的请求(只需用程序名替换
    ,用源文件名替换
    )。只需将其粘贴到与源文件位于同一目录中的名为“makefile”的文件中

    FLAGS=-stdlib=libc++ -Wl,-rpath,/path/to/libcxx/lib
    
    all: <progname>
    
    progname: 
        clang++ $FLAGS progname
    
    从那时起,只需键入
    stdclang

  • 我能想到的最后一件事与上一件相似,但有一个更持久的转折。作为root用户,运行以下命令:
    touch/usr/bin/stdclang&&chmod a+x/usr/bin/stdclang
    然后使用所需的任何编辑器编辑文件
    /usr/bin/stdclang
    ,并添加以下行:

    #!/bin/bash
    clang++ -stdlib=libc++ -Wl,-rpath,/path/to/libcxx/lib $@
    
    然后您可以运行
    stdclang
    让它自动扩展到
    clang++-stdlib=libc++-Wl,-rpath,/path/to/libcxx/lib


  • Clang的CMake构建系统学习了
    Clang\u DEFAULT\u CXX\u STDLIB
    来设置 默认C++标准库.< /p>
    但是,我不知道这个解决方案对您来说有多实际,因为在下一个clang/llvm版本之前,您必须使用树顶构建。

    clang没有配置选项?我不知道。通常libcxx是用新的clang版本构建的,因此在这种情况下,库甚至还不存在。但我会接受一个可以与预先存在的libcxx库一起使用的答案?LD_LIBRARY_PATH有什么问题?如果您不想这样做,只需将libc++安装到/usr/lib即可。我正在研究多个主机上有多个用户的网络设置,其中clang/libcxx安装在NFS共享上。为所有用户设置
    LD\u LIBRARY\u PATH
    是不可行的,安装到
    /usr/lib
    是不可能的。这对Makefile来说不是一个很好的用例,在Makefile中指定Makefile内的标志以便下次只使用make命令吗?不幸的是,这不是我想要的。在您的解决方案中,您总是指定例如
    -stdlib
    标志,即使它没有意义(例如,如果只是运行预处理器阶段)。此外,我正在寻找用户透明的解决方案,即没有包装脚本,没有更改的可执行文件名等。不幸的是,如果clang本身不提供这些配置选项,那么您所能做的就是我列出的,编辑clang源文件(我认为这是合法的?)或编写您自己的编译器。或者使用另一个支持stdlib链接的编译器,而不显式地声明它。另外,如果您只运行预处理器,您只需正常调用
    clang
    ,而不是
    stdclang
    。我刚刚意识到它可能不完全清楚,但这不会消除您单独使用clang的能力,它实际上只是一个每个用户都可以使用的别名。最后,经过两年的等待,我可以结束这个问题@Michael Haidl,你是我的英雄:)对
    CLANG\u DEFAULT\u CXX\u STDLIB=libc++
    感兴趣的人也可能对
    CLANG\u DEFAULT\u RTLIB=compiler rt
    感兴趣。
    #!/bin/bash
    clang++ -stdlib=libc++ -Wl,-rpath,/path/to/libcxx/lib $@