我有一些3rdparty库,它们是作为一个大型项目的一部分构建的。一些库需要C++17,其他库需要在C++17中删除的功能(std::auto_ptr
、std::fun_ptr
)。
对于这个项目,使用Clang (版本11)。根据搜索,如果我使用clang definition _LIBCPP_ENABLE_CXX17_REMOVED_FEATURES
,那么所需版本的不匹配应该不是问题。
然而,这没有任何影响。我在一个很小的测试样本中尝试了这个定义:
#include <memory>
int main(void)
{
std::auto_ptr<int> thing(new int(1));
return 0;
}
在不指定C++ std
的情况下,它可以很好地编译。
但是,如果我指定C++17,它将因-D_LIBCPP_ENABLE_CXX17_REMOVED_FEATURES
而失败
PS E:\> clang++ -std=c++17 -D_LIBCPP_ENABLE_CXX17_REMOVED_FEATURES .\autoptr.cpp
.\autoptr.cpp:5:10: error: no member named 'auto_ptr' in namespace 'std'
std::auto_ptr<int> thing(new int(1));
~~~~~^
.\autoptr.cpp:5:22: error: expected '(' for function-style cast or type construction
std::auto_ptr<int> thing(new int(1));
~~~^
.\autoptr.cpp:5:24: error: use of undeclared identifier 'thing'
std::auto_ptr<int> thing(new int(1));
^
3 errors generated.
c++17删除的功能是否在Clang中不再可用,或者我是否需要额外的编译器选项?
Clang版本:
PS E:\> clang++ -v
clang version 11.1.0
Target: x86_64-pc-windows-msvc
Thread model: posix
InstalledDir: C:\Program Files\LLVM\bin
编辑:有趣的是,这在我的另一个系统上编译得很好。不需要额外的定义。
#@#:~/kraken$ clang++ -v
clang version 10.0.0-4ubuntu1~18.04.2
Target: x86_64-pc-linux-gnu
Thread model: posix
InstalledDir: /usr/bin
edit2:从11.1.0升级到12.0.1。没有变化
$ clang++ -v -stdlib=libc++ -std=c++17 -D_LIBCPP_ENABLE_CXX17_REMOVED_FEATURES -D_LIBCPP_ENABLE_CXX17_REMOVED_AUTO_PTR autoptr.cpp
clang version 12.0.1
Target: x86_64-pc-windows-msvc
Thread model: posix
InstalledDir: C:\Program Files\LLVM\bin
clang++: warning: argument unused during compilation: '-stdlib=libc++' [-Wunused-command-line-argument]
"C:\\Program Files\\LLVM\\bin\\clang++.exe" -cc1 -triple x86_64-pc-windows-msvc19.29.30038 -emit-obj -mrelax-all -mincremental-linker-compatible --mrelax-relocations -disable-free -disable-llvm-verifier -discard-value-names -main-file-name autoptr.cpp -mrelocation-model pic -pic-level 2 -mframe-pointer=none -fmath-errno -fno-rounding-math -mconstructor-aliases -munwind-tables -target-cpu x86-64 -tune-cpu generic -v -resource-dir "C:\\Program Files\\LLVM\\lib\\clang\\12.0.1" -D _LIBCPP_ENABLE_CXX17_REMOVED_FEATURES -D _LIBCPP_ENABLE_CXX17_REMOVED_AUTO_PTR -internal-isystem "C:\\Program Files\\LLVM\\lib\\clang\\12.0.1\\include" -internal-isystem "C:\\Program Files (x86)\\Microsoft Visual Studio\\2019\\Professional\\VC\\Tools\\MSVC\\14.29.30037\\include" -internal-isystem "C:\\Program Files (x86)\\Microsoft Visual Studio\\2019\\Professional\\VC\\Tools\\MSVC\\14.29.30037\\atlmfc\\include" -internal-isystem "C:\\Program Files (x86)\\Windows Kits\\10\\Include\\10.0.19041.0\\ucrt" -internal-isystem "C:\\Program Files (x86)\\Windows Kits\\10\\include\\10.0.19041.0\\shared" -internal-isystem "C:\\Program Files (x86)\\Windows Kits\\10\\include\\10.0.19041.0\\um" -internal-isystem "C:\\Program Files (x86)\\Windows Kits\\10\\include\\10.0.19041.0\\winrt" -std=c++17 -fdeprecated-macro -fdebug-compilation-dir "E:\\" -ferror-limit 19 -fno-use-cxa-atexit -fms-extensions -fms-compatibility -fms-compatibility-version=19.29.30038 -fdelayed-template-parsing -fcxx-exceptions -fexceptions -faddrsig -o "C:\\Users\\JONATH~1.NOB\\AppData\\Local\\Temp\\autoptr-152d67.o" -x c++ autoptr.cpp
clang -cc1 version 12.0.1 based upon LLVM 12.0.1 default target x86_64-pc-windows-msvc
#include "..." search starts here:
#include <...> search starts here:
C:\Program Files\LLVM\lib\clang\12.0.1\include
C:\Program Files (x86)\Microsoft Visual Studio\2019\Professional\VC\Tools\MSVC\14.29.30037\include
C:\Program Files (x86)\Microsoft Visual Studio\2019\Professional\VC\Tools\MSVC\14.29.30037\atlmfc\include
C:\Program Files (x86)\Windows Kits\10\Include\10.0.19041.0\ucrt
C:\Program Files (x86)\Windows Kits\10\include\10.0.19041.0\shared
C:\Program Files (x86)\Windows Kits\10\include\10.0.19041.0\um
C:\Program Files (x86)\Windows Kits\10\include\10.0.19041.0\winrt
End of search list.
autoptr.cpp:5:10: error: no member named 'auto_ptr' in namespace 'std'
std::auto_ptr<int> thing(new int(1));
~~~~~^
autoptr.cpp:5:22: error: expected '(' for function-style cast or type construction
std::auto_ptr<int> thing(new int(1));
~~~^
autoptr.cpp:5:24: error: use of undeclared identifier 'thing'
std::auto_ptr<int> thing(new int(1));
^
3 errors generated.
此输出显示了问题。没有使用LLVMs libcxx。使用-D_HAS_AUTO_PTR_ETC=1为我解决了这个问题。
发布于 2021-09-09 03:47:59
检查哪个c++ stdlib正在与clang的-v标志一起使用。我以为使用了llvm的libcxx,因为-stdlib=libcxx被忽略了。事实上,msvc的stdlib正在被使用。使用msvc:
clang++ -std=c++17 -D_HAS_AUTO_PTR_ETC=1 file.cpp
https://stackoverflow.com/questions/69116001
复制