链接到使用 GCC5 编译的库时,clang 中未定义的引用

2023-12-27

我尝试使用 libmuparser 的 ubuntu 15.10 存储库版本(包 libmuparser2v5)。使用 gcc 编译工作正常,但使用 clang 则不行。我对此进行了更深入的研究,提出了以下最小(非)工作示例和一些问题。

考虑一个具有简单类的库,该类需要string并返回一个string.

testlib.h:

#pragma once

#include <string>

struct Test {
    std::string str;

    void set(std::string s);
    std::string get();
};

testlib.cpp:

#include "testlib.h"

void Test::set(std::string s) {
    str = s;
}

std::string Test::get() {
    return str;
}

这是用 gcc 5.2.1 作为静态库编译的

g++ -Wall -c testlib.cpp -o testlib-gcc.o
ar rcs libtest-gcc.a testlib-gcc.o

现在正在编译一个应用程序main.cpp

#include <iostream>
#include "testlib.h"

int main()
{
    Test p;
    p.set("Hello!");
    std::cout << p.get() << std::endl;
    return 0;
}

与 clang 3.6.2-1 一起使用

clang++ main.cpp -o out-clang libtest-gcc.a

结果出现错误

main.cpp:(.text+0x79): undefined reference to `Test::get()'

现在我发现 gcc5 有一个新功能,称为 ABI 标记,可以帮助对库进行版本控制并在不兼容时防止链接。查看静态库

$ nm -gC libtest-gcc.a

gives:

testlib-gcc.o:
0000000000000026 T Test::get[abi:cxx11]()
0000000000000000 T Test::set(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >)

所以ABI标签cxx11已添加用于get但不是为了set。当一个方法返回一个string。这就是为什么 clang 只声称没有找到Test::get().

我想这样做是为了给予get一个调用签名,明确表明需要 c++11 才能与该函数链接。为了set这是没有必要的,因为__cxx11在类型中。

问题:

  • 我的猜测是否正确,或者还有什么需要补充的吗?
  • If so, how to fix this?
    • 什么可以图书馆作家如何使库可链接到 gcc 5.2 和 clang 3.6 编译代码? (源代码改变?)
    • 什么可以图书馆用户使用 clang 3.6 对使用 gcc 5.2 编译的库进行编译和链接,反之亦然。 (源代码更改或编译标志?)
    • 什么可以包维护者如何使库可链接到 gcc 5.2 和 clang 3.6 编译代码? (编译标志?)
    • 这个问题会被修复吗铿锵开发者未来版本(哪个版本)? (默认情况下 ABI 兼容性?)但是现在如果有一个解决方案仍然很好,因为否则 clang 很难在 ubuntu 15.10 及其衍生产品上使用。

附加信息:

  • 的签名get定义时testlib.cpp已编译。因此,共享对象不会产生任何影响。也可以用一个nm -gC testlib-gcc.o查看符号。
  • 在用 clang 编译的库中,签名为get is Test::get()。然后gcc找不到该符号Test::get[abi:cxx11](),因此兼容性被相互破坏。
  • 使用编译标志-D_GLIBCXX_USE_CXX11_ABI=0对于海湾合作委员会(发现here http://developerblog.redhat.com/2015/02/05/gcc5-and-the-c11-abi/) 没有解决方案,从那时起 set 的签名也发生了变化:Test::set(std::string) (but get那么就可以了)。
  • 使用编译标志-stdlib=libc++在 clang 中似乎没有帮助,因为它还报告了对的未定义引用Test::get()(以及更多未定义的引用)。

None

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

链接到使用 GCC5 编译的库时,clang 中未定义的引用 的相关文章

随机推荐

  • Symfony/PHPUnit 模拟服务

    我正在使用 PHPUnit 为 Symfony 编写功能测试 但我的模拟不起作用 我可能误解了它们的工作原理 在我的单元测试中setUp 方法我有这个代码 Create a stub stub this gt getMockBuilder
  • 如何处理“太多 HTTP 重定向”错误

    当我将网站加载到可可应用程序的 Web 视图中时 就会出现此问题 我的问题描述 错误域 NSURLErrorDomain代码 1007 HTTP重定向太多 用户信息 0x18d17d56 NSErrorFailingURLStringKey
  • FormData 构造函数丢失 Edge 中的文本区域值

    我有一个文本区域
  • ggplot 时间序列绘图:按日期分组

    我想在同一个面板图上绘制多个时间序列 而不是在单独的面板上 我从以下位置获取了 R 代码另一个 stackoverflow 帖子 https stackoverflow com questions 14136703 ggplot2 time
  • 如何以编程方式确定包含哪些待签入项目?

    我可以查询 PendingSets 和候选 PendingSets 并且似乎无法区分包含的挂起更改和排除的挂起更改 我在包含的更改中包含一个文件 可以通过 Visual Studio 团队资源管理器签入 使用 Tfs dll 查询 我得到有
  • 附件的 HTTP 响应标头内容处置

    背景 将 XML 文档写入浏览器的响应流 并使浏览器显示 另存为 对话框 Problem 考虑以下download method HttpServletResponse response getResponse BufferedWriter
  • 更改上下文节点的 XSLT 指令/函数列表?

    有谁知道更改上下文节点的 XSLT 指令 函数列表 例如 像这样的指令for each是其中之一 更改上下文的明显 XSLT 2 0 指令是for each apply templates for each group and analyz
  • 将在 JBoss 4.2 上运行良好的应用程序部署到 JBoss 5 时出错

    我尝试将应用程序 ear 文件 部署到 JBoss 5 但收到以下错误 该应用程序在 4 2 2 下部署良好 15 31 33 172 ERROR AbstractKernelController Error installing to R
  • 如何从 pandas DataFrame 输出带有合并单元格的 html 表格

    我有一个 pandas DataFrame df 作为 gt gt gt df pd DataFrame 1 2 2 2 3 1 2 3 3 3 1 3 2 3 5 7 9 9 3 2 columns list ABCDE I want t
  • 使用 R-markdown knitr hooks 自定义 HTML 报告中的表格格式

    我正在尝试建立一个knitr knit hooks 自动格式化 R markdown 块的数据帧输出kableExtra在我的 HTML 报告中 我不想重复将以下行 或任何行 添加到每个列表数据块的末尾 head iris gt kable
  • App Store 中的应用内购买被拒绝

    我的免费应用程序刚刚从应用程序商店被拒绝 我上传了 3 个应用程序 HD iPad PayedIphone 和 freeiphone 在免费版本中 我有一个完整版本的链接 显然我需要免费版本的 inAppPurchase 而不是链接到完整版
  • 未找到未捕获的模块 jqueryify

    我的情况 我正在查看 spin js 以获取我正在考虑编写的 Web 应用程序 我已阅读所有文档并浏览了所有示例 现在 我尝试在我自己的 Windows 7 笔记本电脑上运行 spin contacts 示例项目 我正在运行适用于 Wind
  • 实体框架 GroupBy 采用 mySQL 最古老的

    我有一个巨大的项目列表 需要按一个属性对它们进行分组 然后应该选择每组中最古老的 简化示例 选择每个用户中最旧的用户FirstName using ED NWEntities ctx new ED NWEntities IQueryable
  • 如何使用 numpy 构建排序数组? (什么是等级数组?)

    我希望你们所有人都度过愉快的一天 在我的 Python 课上 我们正在学习如何使用 Numpy 因此我们收到了有关该内容的作业 我的问题是 什么是排名数组以及如何使用 python 构建它 我的老师试图用这些台词解释这一点 但我实际上什么也
  • 如何在 YAWS/Erlang 中发送消息以接收

    通常在 Erlang 程序员中使用 在并发编程中发送消息以接收符号 但是我们如何在雅司病中做到这一点 说我正在尝试这样做 gt
  • 如何在 Rust 中解码和编码浮点数?

    我想在 Rust 中解码 存储和编码浮点数 我知道关于num Float integer decode https docs rs num 0 1 36 num trait Float html tymethod integer decod
  • Android 中 Google 地图上的图像平铺

    我正在开发一个 Android 应用程序 我在 Android 中的 Google 地图上放置了图像图块 我可以用简单的 javascript 来做 但谁能告诉我如何在 android 中做到这一点 这是我的 JavaScript 代码 f
  • 将打印重定向到日志文件

    好的 我已经完成了我的第一个Python程序 它有大约1000行代码 在开发过程中我放置了大量print使用运行命令之前的语句os system 说类似的话 print running command cmd os system cmd 现
  • 如何在多行 Vim 缩写中 Eatchar

    我想在 Vim 中触发多行缩写 无需输入 触发 字符 并且光标在特定位置以插入模式结束 我已经快到了 但只是没能成功 到目前为止 我已将以下内容添加到我的 vimrc 中 eat characters after abbreviation
  • 链接到使用 GCC5 编译的库时,clang 中未定义的引用

    我尝试使用 libmuparser 的 ubuntu 15 10 存储库版本 包 libmuparser2v5 使用 gcc 编译工作正常 但使用 clang 则不行 我对此进行了更深入的研究 提出了以下最小 非 工作示例和一些问题 考虑一