-fmodules当使用下面所示的命令进行编译时,以下简单的测试用例文件给了我一个编译时错误,提示来自 Clang 的 github 镜像的“master” 。我想知道这是否是 Clang 的新实验性模块功能的一个错误——可能是标准库模块映射的实现问题——或者我是否做错了什么。-fbuiltin-module-map如果我添加到命令中,错误仍然出现。stdint.h有趣的是,如果我替换为 ,该错误就不再出现cstdint。
#include <stdint.h>
uint64_t foo;
Run Code Online (Sandbox Code Playgroud)
这是我的编译命令,带有错误消息:
anhall@leviathan: /Users/anhall/impersonal/code/llvm-reflexpr/install/bin/clang++ -o module-uint64_t-test.o -c module-uint64_t-test.cpp --std=c++1z -fmodules
module-uint64_t-test.cpp:3:1: error: missing '#include <_types/_uint64_t.h>'; declaration of 'uint64_t' must be imported from module 'Darwin.POSIX._types._uint64_t' before it is
required
uint64_t foo;
^
/usr/include/_types/_uint64_t.h:31:28: note: previous declaration is here
typedef unsigned long long uint64_t;
Run Code Online (Sandbox Code Playgroud)
有关我正在使用的构建的信息:它来自 Matus Chochlik 的 github Clang 镜像的分支;但我设置为与原始 clang git 镜像中“master”的(当时)头相对应的提交(换句话说,它不包括来自 Matus Chochlik 的功能“reflexpr”分支的提交):
anhall@leviathan: /Users/anhall/impersonal/code/llvm-reflexpr/install/bin/clang++ -v
clang version 4.0.0 …Run Code Online (Sandbox Code Playgroud) 我编写了一个使用或CMakeLists.txt构建项目的方法。g++clang++
为了捕获尽可能多的错误,我同时使用libc++with -D_LIBCPP_DEBUG2=2(for clang++) 和libstdc++with -D_GLIBCXX_DEBUG(for Both g++and clang++)。
set(CMAKE_CXX_FLAGS_DEBUG "-ggdb -fno-inline -DDEBUG=1 -march=x86-64 -mtune=generic")
#[[
if("${CMAKE_CXX_COMPILER_ID}" MATCHES "Clang")
set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -D_LIBCPP_DEBUG2=2")
elseif("${CMAKE_CXX_COMPILER_ID}" MATCHES "GNU")
set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -D_GLIBCXX_DEBUG")
endif()
]]
if(CMAKE_BUILD_TYPE STREQUAL "Debug")
elseif(CMAKE_BUILD_TYPE STREQUAL "Release")
set(CMAKE_CXX_FLAGS_RELEASE "-O3 -DNDEBUG=1 -march=native")
elseif(CMAKE_BUILD_TYPE STREQUAL "RelWithDebInfo")
set(CMAKE_CXX_FLAGS_RELWITHDEBINFO "-fno-omit-frame-pointer -DNDEBUG=1 -march=native")
if("${CMAKE_CXX_COMPILER_ID}" MATCHES "Clang")
set(CMAKE_CXX_FLAGS_RELWITHDEBINFO "${CMAKE_CXX_FLAGS_RELWITHDEBINFO} -O3 -gline-tables-only")
elseif("${CMAKE_CXX_COMPILER_ID}" MATCHES "GNU")
set(CMAKE_CXX_FLAGS_RELWITHDEBINFO "${CMAKE_CXX_FLAGS_RELWITHDEBINFO} -Og -ggdb")
endif()
elseif(CMAKE_BUILD_TYPE STREQUAL "MinSizeRel")
set(CMAKE_CXX_FLAGS_MINSIZEREL "-Os …Run Code Online (Sandbox Code Playgroud) 我们为 iOS 项目编写了一些 c 库,升级到 Xcode 10 后,编译时出现错误:
\n\nerror: include path for stdlibc++ headers not found; pass \xe2\x80\x98-std=libc++\xe2\x80\x99\non the command line to use the libc++ standard library instead\n[-Werror,-Wstdlibcxx-not-found]\n 1 error generated.\nRun Code Online (Sandbox Code Playgroud)\n\n我们需要在哪些 makefile 中进行更改?因为我在其中找不到 '-std=' 参数。
\n即使使用 -fno-rtti 编译,它似乎在 GCC 和 Clang 中std::any 也能正常工作。
在查看 libc++ 源代码时,我发现他们只是使用了一个简单的技巧:
它们获取以任何类型为模板的变量的地址,这就是它们获取唯一 ID 的方式。
但此代码仅在没有打开 RTTI 时才有效。
这让我想知道。他们为什么首先使用 RTTI?为什么不总是使用这个解决方案呢?我不知道为什么typeid比简单的指针(指向每个类型实例化的静态变量)比较更快。
该函数std::char_traits::copy的实现libc++如下:
template <class _CharT>
inline _LIBCPP_CONSTEXPR_AFTER_CXX17
_CharT*
char_traits<_CharT>::copy(char_type* __s1, const char_type* __s2, size_t __n)
{
if (!__libcpp_is_constant_evaluated()) {
_LIBCPP_ASSERT(__s2 < __s1 || __s2 >= __s1+__n, "char_traits::copy overlapped range");
}
char_type* __r = __s1;
for (; __n; --__n, ++__s1, ++__s2)
assign(*__s1, *__s2);
return __r;
}
Run Code Online (Sandbox Code Playgroud)
情况_LIBCPP_ASSERT似乎倒退了。难道不应该吗
__s1 < __s2 || __s1 >= __s2+__n
Run Code Online (Sandbox Code Playgroud)
我缺少什么?
在我们的项目中,我们使用在其实现中非常紧密地使用libc ++的库.当我们添加Google Maps SDK时,我们遇到了链接错误:
Undefined symbols for architecture i386:
"std::string::_Rep::_M_destroy(std::allocator<char> const&)", referenced from:
gmscore::utils::gmsutils::StringPrintf(char const*, ...) in GoogleMaps(GMSUtils.o)
_GMS_objc_lookUpClass in GoogleMaps(GMSRenames.o)
_GMS_objc_getClass in GoogleMaps(GMSRenames.o)
_GMS_objc_getProtocol in GoogleMaps(GMSRenames.o)
gmscore::vector::CameraPosition::StringValue() const in GoogleMaps(CameraPosition.o)
"std::string::_Rep::_S_empty_rep_storage", referenced from:
gmscore::utils::gmsutils::StringPrintf(char const*, ...) in GoogleMaps(GMSUtils.o)
_GMS_objc_lookUpClass in GoogleMaps(GMSRenames.o)
_GMS_objc_getClass in GoogleMaps(GMSRenames.o)
_GMS_objc_getProtocol in GoogleMaps(GMSRenames.o)
gmscore::vector::CameraPosition::StringValue() const in GoogleMaps(CameraPosition.o)
gmscore::utils::gmsutils::StringPrintf(char const*, ...) in GoogleMaps(GMSUtils.o)
_GMS_objc_lookUpClass in GoogleMaps(GMSRenames.o)
_GMS_objc_getClass in GoogleMaps(GMSRenames.o)
_GMS_objc_getProtocol in GoogleMaps(GMSRenames.o)
gmscore::vector::CameraPosition::StringValue() const in GoogleMaps(CameraPosition.o)
gmscore::utils::gmsutils::StringPrintf(char const*, ...) in GoogleMaps(GMSUtils.o)
_GMS_objc_lookUpClass in GoogleMaps(GMSRenames.o)
_GMS_objc_getClass in …Run Code Online (Sandbox Code Playgroud) 我正在尝试构建LLVM并将其链接到libc ++,但我无法让它工作.我下载了最新版本(LLVM 3.2).
$ CXXFLAGS=-stdlib=libc++ LDFLAGS=-stdlib=libc++ ../llvm-3.2.src/configure
$ make
llvm[0]: Constructing LLVMBuild project information.
llvm[1]: Compiling APFloat.cpp for Release+Asserts build
llvm[1]: Compiling APInt.cpp for Release+Asserts build
(etcetera)
llvm[1]: Building Release+Asserts Archive Library libLLVMTableGen.a
llvm[2]: Compiling FileCheck.cpp for Release+Asserts build
llvm[2]: Linking Release+Asserts executable FileCheck (without symbols)
Undefined symbols for architecture x86_64:
"std::string::find_last_not_of(char, unsigned long) const", referenced from:
llvm::SMDiagnostic::print(char const*, llvm::raw_ostream&, bool) const in libLLVMSupport.a(SourceMgr.o)
"std::string::copy(char*, unsigned long, unsigned long) const", referenced from:
llvm::sys::Path::makeUnique(bool, std::string*) in libLLVMSupport.a(Path.o)
"std::string::find(char const*, unsigned long, …Run Code Online (Sandbox Code Playgroud) 如何让scons使用Clang和libc ++?在我传递给Environment的任何标志中放入"-stdlib = libc ++"会导致未定义的引用错误,如下所示:
hello.o: In function `main':
hello.cpp:(.text+0xc): undefined reference to `std::__1::cout'
hello.o: In function `std::__1::basic_ostream<char, std::__1::char_traits<char> >& std::__1::endl<char, std::__1::char_traits<char> >(std::__1::basic_ostream<char, std::__1::char_traits<char> >&)':
Run Code Online (Sandbox Code Playgroud) 我很难配置iOS项目,该项目使用与gcc使用的旧libstdc ++链接的静态库.该库是32位和64位.
有6个库(例如libssl.a)是32位的,必须更新.如果我从源代码编译这些库,它们将自动与libc ++链接,这将导致我的链接器抱怨.
因此,这是我的问题:
1)有没有办法让项目中的单个静态库使用libstdc ++,让其他人使用libc ++?
2)如何从源代码编译库(如libcrypto和libssh)并强制它们使用旧的libstdc ++标准库?
3)这个烂摊子还有其他方法吗?
最近,我在其动态部分(readelf -d)中看到了libstdc ++和libc ++的C++程序列表.
我很困惑,因为一个来自GNU,另一个来自LLVM,它们都是STL的实现.那么一个程序如何链接呢?那是什么意思?
它如何解决std::string链接时提供的符号(例如)?