- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
我们最近因为 GCC 5.1, libstdc++ and Dual ABI 收到了一份报告.好像Clang is not aware of the GCC inline namespace changes ,因此它基于一组命名空间或符号生成代码,而 GCC 使用另一组命名空间或符号。在链接时,由于缺少符号而出现问题。
如果我正在解析 Dual ABI页面正确,看起来像是在 _GLIBCXX_USE_CXX11_ABI
和 abi::cxx11
上进行旋转的问题,还有一些额外的困难。更多阅读请访问 Red Hat 的博客 GCC5 and the C++11 ABI和 The Case of GCC-5.1 and the Two C++ ABIs .
以下来自 Ubuntu 15 机器。 native 提供GCC 5.2.1。
$ cat test.cxx
#include <string>
std::string foo __attribute__ ((visibility ("default")));
std::string bar __attribute__ ((visibility ("default")));
$ g++ -g3 -O2 -shared test.cxx -o test.so
$ nm test.so | grep _Z3
...
0000201c B _Z3barB5cxx11
00002034 B _Z3fooB5cxx11
$ echo _Z3fooB5cxx11 _Z3barB5cxx11 | c++filt
foo[abi:cxx11] bar[abi:cxx11]
如何使用两种装饰生成带有符号的二进制文件(Red Hat 博客称之为“共存”)?
或者,我们有哪些选择?
我正在努力为用户实现“它只是工作”。我不在乎是否有两个具有两种不同行为的弱符号(std::string
缺少写时复制,而 std::string[abi:cxx11]
提供写时复制)。或者,一个可以是另一个的别名。
Debian 在 Debian Bug report logs: Bugs tagged libstdc++-cxx11 上有大量类似的错误。 .他们的解决方案是在新的 ABI 下重建所有内容,但它没有处理混合/匹配编译器以 ABI 更改为模的极端情况。
在 Apple 世界中,我认为这接近于一个胖二进制文件。但我不确定在 Linux/GCC 世界中该做什么。最后,我们不控制发行版如何构建库,也不控制使用哪些编译器将应用程序与库链接。
最佳答案
免责声明,以下内容未经生产测试,使用风险自负。
您可以自己在双 ABI 下发布您的库。这或多或少类似于 OSX “胖二进制”,但完全使用 C++ 构建。
最简单的方法是编译库两次:分别使用 -D_GLIBCXX_USE_CXX11_ABI=0
和 -D_GLIBCXX_USE_CXX11_ABI=1
。根据宏的值将整个库放在两个不同的命名空间下:
#if _GLIBCXX_USE_CXX11_ABI
# define DUAL_ABI cxx11 __attribute__((abi_tag("cxx11")))
#else
# define DUAL_ABI cxx03
#endif
namespace CryptoPP {
inline namespace DUAL_ABI {
// library goes here
}
}
现在您的用户可以像往常一样使用 CryptoPP::whatever
,这映射到 CryptoPP::cxx11::whatever
或 CryptoPP::cxx03::任何
取决于所选的 ABI。
注意,GCC 手册说此方法将更改标记的内联命名空间中定义的所有内容的重命名。根据我的经验,这不会发生。
如果 _GLIBCXX_USE_CXX11_ABI
不为零,则另一种方法是使用 __attribute__((abi_tag("cxx11")))
标记每个类、函数和变量。这个属性很好地将 [cxx11]
添加到 demangler 的输出中。我认为使用命名空间同样有效,并且需要对现有代码进行较少的修改。
理论上你不需要复制整个库,只需要复制使用 std::string
和 std::list
的函数和类,以及函数和类使用这些函数和类,以此类推。但在实践中,这可能不值得付出努力,尤其是在库不是很大的情况下。
关于c++ - 由于符号与 abi::cxx11 的链接问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36159238/
我想知道是否有办法只在编译时而不是在链接时将一些标志传递给编译器 (g++)。让我用一个例子来解释:我想这样构建我的程序: g++ -c source1.cpp -o source1.o g++ -c
我们在使用 Visual Studio 2012 在 Windows 7 64Bit 下使用 CMake (v2.8.12) 编译项目时遇到问题。CMake 给我们以下错误。我们已经尝试使用管理员权限
我是 Linux 的新用户,正在尝试下载 Avogadro 1.2.0。 我在使用命令 cmake ../ 时遇到问题,当我这样做时 -- The C compiler identification
我使用的是 Julia 1.1.1 和 Cxx 的 0.3.2 版。我发现当我从我定义的模块中调用 icxx""时出现错误,但在 REPL 中调用它时却没有。在我的 REPL 中: using Cxx
./cmake-3.4.1/bin/cmake .. -- The CXX compiler identification is unknown CMake Error at CMakeLists.t
我的代码库中有大量文件。我正在尝试使用具有一个文件 a.h. 的其他库来编译我的代码库。如果我在我的代码库中包含 say a.h 文件,我会遇到编译问题,该文件已经定义了一些具有与 a.h 中定义的枚
这个问题在这里已经有了答案: 关闭 10 年前。 Possible Duplicate: Where does the value of CXX in a makefile come from? 我
我正在尝试使用 Cmake 将外部库安装到我的 C++ 项目中。我希望使用该库生成 Xcode 项目。在我的终端中,我从构建目录运行以下命令: cmake -G Xcode .. 这给了我以下错误:
我正在尝试在ubuntu 16.10上交叉编译ndn-cxx以在arduino yun上使用它。我正在关注steps。 当我尝试执行./waf命令时,出现以下错误: [ 30/141] Com
来自CXX Driver Quickstart guide我完全无法在 Ubuntu 或 CentOS VM 上完成新驱动程序的编译。 我已经按照这封信中的步骤执行了好几次,但我不确定哪里出了问题。
我有一个类,它有一个 bsoncxx::document::view view 作为 private 属性,还有一个从 Mongo 数据库获取文档并保存的方法结果在本地 bsoncxx::docume
这个问题在这里已经有了答案: gitignore does not ignore folder (7 个答案) 关闭 10 个月前。 我的 android 项目中有这个 .gitignore 文件,
我正在尝试在 Ubuntu14.4 上编译 mongo-cxx-driver-r3.1.1 。我已经按照说明从源代码安装了 mongo-c-driver-1.6.3。 pkg-config --cfl
我尝试让我的库目标依赖于 c++14。我怎样才能实现链接到我的库目标的目标也依赖于 c++14? 我尝试使用: add_library(lib SHARED ${FILES}) target_comp
帮助!我在提交我的项目使用 dbus-cxx 时可能犯了一个巨大的错误。该库似乎已被其作者遗弃,并且邮件列表对新成员不开放。这是我的问题: 没有关于使用 dbux-cxx 发送或接收包含非 POD 数
我使用 dbus-cxx通过 dbus 进行方法调用。现在有返回多个参数的方法,我不知道如何接收第一个参数以外的任何参数。 我初始化代理方法: DBus::MethodProxy& info_prox
CXX 测试框架的有效性如何,假设您正在围绕您编写的代码编写单元测试用例。代码中的任何错误也可能会转化为单元测试代码中的错误吗?这不是两个负数组成一个正数吗? 此外,花在 CXX 上的时间和精力至少等
在 cmake 已经预编译失败后,在 99% 编译时链接 CXX 可执行世界服务器。 [ 99%] Linking CXX executable worldserver /usr/bin/ld: ..
代码片段: target_test : test.cc $(CXX) $(CPPFLAGS) $(CFLAGS) test.cc 我知道 CXX 是一个变量(包含要调用的编译器命令),但我想知
我正在使用以下代码查询一个集合: bsoncxx::stdx::optional query_result = collection.find_one(bsoncxx::builder::stream
我是一名优秀的程序员,十分优秀!