如何避免多重定义链接错误?

2023-11-21

除了移动hello()将函数复制到另一个源 (.cpp) 文件中或重命名该函数。还有其他方法可以避免链接错误吗?

静态LibA.h

#ifndef _STATIC_LIBA_HEADER
#define _STATIC_LIBA_HEADER

int hello(void);
int hello_staticLibA_only(void);

#endif

静态LibA.cpp

#include "staticLibA.h"

int hello(void)
{
    printf("\nI'm in staticLibA\n");
    return 0;
}

int hello_staticLibA_only(void)
{
    printf("\nstaticLibA: hello_staticLibA_only\n");
    return 0;
}

output:

g++ -c -Wall -fPIC -m32 -o staticLibA.o staticLibA.cpp
ar -cvq ../libstaticLibA.a staticLibA.o
a - staticLibA.o

静态库B.h

#ifndef _STATIC_LIBB_HEADER
#define _STATIC_LIBB_HEADER

int hello(void);
int hello_staticLibB_only(void);

#endif

静态LibB.cpp

#include "staticLibB.h"

int hello(void)
{
    printf("\nI'm in staticLibB\n");
    return 0;
}

int hello_staticLibB_only(void)
{
    printf("\nstaticLibB: hello_staticLibB_only\n");
    return 0;
}

output:

g++ -c -Wall -fPIC -m32 -o staticLibB.o staticLibB.cpp 
ar -cvq ../libstaticLibB.a staticLibB.o 
a - staticLibB.o

main.cpp

extern int hello(void);
extern int hello_staticLibA_only(void);
extern int hello_staticLibB_only(void);

int main(void)
{
  hello();
  hello_staticLibA_only();
  hello_staticLibB_only();
  return 0;
}

output:

g++ -c  -o main.o main.cpp
g++ -o multipleLibsTest main.o  -L. -lstaticLibA -lstaticLibB -lstaticLibC -ldl -lpthread -lrt
./libstaticLibB.a(staticLibB.o): In function `hello()':
staticLibB.cpp:(.text+0x0): multiple definition of `hello()'
./libstaticLibA.a(staticLibA.o):staticLibA.cpp:(.text+0x0): first defined here
collect2: ld returned 1 exit status
make: *** [multipleLibsTest] Error 1

由于您似乎拥有这两个库,因此不清楚为什么您无法重命名该函数......

In your main,你有这一行:

hello();

如果您让链接错误消失,您期望这里发生什么?是否应该调用实现LibA, or LibB?依靠将库传递给链接器的顺序来确定链接哪个函数似乎是非常糟糕的主意。在一个真实的例子中,如果你的hello_staticLibB_only函数正在调用hello()?它最终可能会调用其他库中的函数版本......

当你使用g++,你应该考虑将你的库函数放入namespace(它们旨在帮助您避免这种命名冲突)。这将使您的代码和链接器能够区分方法之间的差异。

遵循这种方法LibA, 你将会拥有:

静态LibA.h

#ifndef _STATIC_LIBA_HEADER
#define _STATIC_LIBA_HEADER

// Declare namespace to keep library functions together
namespace LibA {
    int hello(void);
    int hello_staticLibA_only(void);
}

#endif

静态LibA.cpp

#include "staticLibA.h"
#include <stdio.h>

// Indicate that contained function definitions belong in the LibA namespace
namespace LibA {
    int hello(void)
    {
        printf("\nI'm in staticLibA\n");
        return 0;
    }

    int hello_staticLibA_only(void)
    {
        printf("\nstaticLibA: hello_staticLibA_only\n");
        return 0;
    }
}

main.cpp

// These declarations would usually be in a header... but I've left
// them here to match your sample code...

// declare relevant functions to belong to the LibA namespace
namespace LibA{
    extern int hello(void);
    extern int hello_staticLibA_only(void);
}

// declare relevant functions from LibB (note they are not
// in a namespace)
extern int hello(void);
extern int hello_staticLibB_only(void);

int main(void)
{
    // Explicitly call the hello from LibA
    LibA::hello();
    // Call the other library function (also from LibA)
    LibA::hello_staticLibA_only();

    // Call library functions from LibB (note they don't require a namespace
    // because I haven't updated it to have one)
    hello();
    hello_staticLibB_only();
    return 0;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何避免多重定义链接错误? 的相关文章

  • 是否可以使用 http url 作为 DirectShow .Net 中源过滤器的源位置?

    我正在使用 DirectShow Net 库创建一个过滤器图 该过滤器图通过使用 http 地址和 WM Asf Writer 来流式传输视频 然后 在网页上 我可以使用对象元素在 Windows Media Player 对象中呈现视频源
  • C#.Net 邮件将进入垃圾邮件文件夹

    我正在从 ASP net Web 应用程序发送电子邮件 邮件发送成功 没有失败 但大多数都进入了垃圾邮件文件夹 请帮助我克服垃圾邮件过滤器 我的发送邮件代码 public void SendMail string FromAddress s
  • C# 中的 Stack<> 实现

    我最近一直在实现递归目录搜索实现 并且使用堆栈来跟踪路径元素 当我使用 string Join 连接路径元素时 我发现它们被颠倒了 当我调试该方法时 我查看了堆栈 发现堆栈内部数组中的元素本身是相反的 即最近 Push 的元素位于内部数组的
  • 无法继承形状

    为什么我不能使用继承 a 的类Shapes class http msdn microsoft com en us library ms604615 28v vs 90 29 我需要延长Rectangle具有一些方法的类 但我想以与使用相同
  • 在 C++ 代码中转换字符串

    我正在学习 C 并开发一个项目来练习 但现在我想在代码中转换一个变量 字符串 就像这样 用户有一个包含 C 代码的文件 但我希望我的程序读取该文件并插入将其写入代码中 如下所示 include
  • 如何修复错误:“检测到无法访问的代码”

    我有以下代码 private string GetAnswer private int CountLeapYears DateTime startDate return count String answer GetAnswer Respo
  • Android NDK 代码中的 SIGILL

    我在市场上有一个 NDK 应用程序 并获得了有关以下内容的本机崩溃报告 SIGILL信号 我使用 Google Breakpad 生成本机崩溃报告 以下是详细信息 我的应用程序是为armeabi v7a with霓虹灯支持 它在 NVIDI
  • 用于在标头更改时重新编译的简单 C 项目的示例 makefile

    有谁有完整的 makefile 可以执行以下操作 如果 HEADER 文件发生更改 则重建项目 cpp 文件在 makefile 中列出 头文件未在 makefile 中列出 头文件允许与 cpp 文件具有不同的名称 部分cpp文件没有头文
  • 为什么这个 makefile 在“make clean”上执行目标

    这是我当前的 makefile CXX g CXXFLAGS Wall O3 LDFLAGS TARGET testcpp SRCS main cpp object cpp foo cpp OBJS SRCS cpp o DEPS SRCS
  • if constexpr 中的 not-constexpr 变量 – clang 与 GCC

    struct A constexpr operator bool const return true int main auto f auto v if constexpr v A a f a clang 6 接受该代码 GCC 8 拒绝它
  • 测量进程消耗的 CPU 时钟

    我用 C 语言编写了一个程序 它是作为研究结果创建的程序 我想计算程序消耗的确切 CPU 周期 精确的循环次数 知道我怎样才能找到它吗 The valgrind tool cachegrind valgrind tool cachegrin
  • 条件类型定义

    如果我有一小段这样的代码 template
  • wordexp 失败时我们需要调用 wordfree 吗?

    wordexp 失败时我们需要调用 wordfree 吗 在某些情况下 调用 wordfree 似乎会出现段错误 例如 当 wordfree 返回字符串为 foo bar 的错误代码时 这在手册页中并不清楚 我已经看到在某些错误情况下使用了
  • 如何在 Javascript 中连接 C# ActiveX 事件处理程序

    我尝试使用几个代码片段将 ActiveX 对象与 Javascript 事件处理程序挂钩 我无法确定为什么事件处理程序没有被调用 带有项目的 Github 存储库 https github com JesseKPhillips Csharp
  • 对于 C# Express 用户来说,有哪些好的工具可以识别可能重复的代码? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 也可以看看 有什么工具可以检查重复的 VB NET 代码吗 https stackoverflow c
  • MySQL 连接器 C++ 64 位在 Visual Studio 2012 中从源代码构建

    我正在尝试建立mySQL 连接器 C 从源头在视觉工作室2012为了64 bit建筑学 我知道这取决于一些boost头文件和C 连接器 跑步CMake生成一个项目文件 但该项目文件无法编译 因为有一大堆非常令人困惑的错误 这些错误可能与包含
  • C++ 指针引用混淆

    struct leaf int data leaf l leaf r struct leaf p void tree findparent int n int found leaf parent 这是 BST 的一段代码 我想问一下 为什么
  • 如何从 Windows Phone 7 模拟器获取数据

    我有一个 WP7 的单元测试框架 它在手机上运行 结果相当难以阅读 因此我将它们写入 XDocument 我的问题是 如何才能将这个 XML 文件从手机上移到我的桌面上 以便我可以实际分析结果 到目前为止 我所做的是将 Debugger B
  • ContentDialog Windows 10 Mobile XAML - 全屏 - 填充

    我在项目中放置了一个 ContentDialog 用于 Windows 10 上的登录弹出窗口 当我在移动设备上运行此项目时 ContentDialog 未全屏显示 并且该元素周围有最小的填充 在键盘上可见 例如在焦点元素文本框上 键盘和内
  • 如何在 C# 中获取 CMD/控制台编码

    我需要指定正确的代码页来使用 zip 库打包文件 正如我所见 我需要指定控制台编码 在我的例子中为 866 C Users User gt mode Status for device CON Lines 300 Columns 130 K

随机推荐

  • Java 中的 AES-256-CBC

    我正在尝试编写一个简单的 Java 程序 该程序将使用以下命令加密纯文本AES 256 CBC 有类 import javax crypto Cipher import javax crypto spec IvParameterSpec i
  • 第一个带有类的元素的 CSS 选择器

    我有一堆带有类名的元素red 但我似乎无法选择第一个元素class red 使用以下 CSS 规则 home red first child border 1px solid red div class home span blah spa
  • 新的 Apple 登录不断抛出错误 HTTP 400 Invalid_grant

    据苹果公司称doc为了验证 Apple 的授权码 我们需要 POST 到http appleid apple com auth token使用这个参数 java token generateJWT keyId teamId clientId
  • 仅使用 CSS 是否可以保持垂直节奏?

    我正在开发一个面向排版的 WordPress 主题 但我在使用内联图像时遇到了麻烦 我可以控制每个元素并调整其行高 下边距等 以保持垂直节奏 但由于通过编辑器粘贴的图像可以具有任意高度 因此它们显然会破坏以下所有内容 是否可以使用边距 填充
  • 在 Java 中使用 GroupLayout 构建 GUI

    我需要使用 GroupLayout 而不是其他布局 构建 GUI GUI 将如下所示 field 1 field 2 field 3 FFIEEELLLDD4 FIELDDDDDD5 FIEEEEEEEEEEEEEEELDDDD 6 字段
  • 停止 webbrowser C# 控件中的警报 javascript 弹出窗口

    这个网站 有这个代码 所以我的网络浏览器控件显示一个弹出窗口 如何在不使用 sendkeys Enter 的情况下绕过弹出窗口 如果您打算永远不使用alert 函数在您的页面上 您也可以覆盖它 例如 如果你确实需要使用 JavaScript
  • 使用 Powershell 调用 Rest API - CosmosDb

    我试图使用 Cosmos DB REST Api 部署 Cosmos 数据库 我正在使用一个函数来构建授权标头 我从以下位置获取了脚本https gallery technet microsoft com scriptcenter How
  • Python,网络驱动程序错误(Selenium)

    import time from selenium import webdriver from selenium webdriver common action chains import ActionChains from seleniu
  • 从 double 中获取小数部分

    我想以整数的形式接收小数点后的数字 例如 从 1 05 开始仅 05 或从 2 50 开始仅 50not 0 50 最好的方法是 var floatNumber 12 5523 var x floatNumber Math Truncate
  • PHP 中的初级数据缓存

    我正在使用 simpleXML 来浏览 Twitter XML 文件的 XML 结果 但我完全不知道如何使用 PHP 缓存结果 本文似乎有一些帮助 但我也遇到过memcache 和memcached 来吧 命名者 我不知道该怎么做 我正在使
  • Pyinstaller 和 Pandas 的导入错误

    我正在尝试将一个简短的 python 脚本捆绑到一个可执行文件中 我能够使用成功运行 pyinstaller pyinstaller script py 但是 当我运行可执行文件时 出现以下错误 我已经尝试了一切 但似乎没有任何效果 C U
  • 错误:在 R 中找不到函数...

    这是一个常见问题解答问题 因此请尽可能完整 答案是社区答案 因此如果您认为缺少某些内容 请随时进行编辑 这个问题在meta上进行了讨论和批准 我正在使用 R 并尝试过some function但我收到以下错误消息 Error could n
  • 公布的磁盘空间与实际磁盘空间[关闭]

    Closed 这个问题是无关 目前不接受答案 为什么广告的磁盘空间几乎总是高于 UI 报告的磁盘空间 例如 我有一个 80 GB 硬盘 但 iTunes UI 仅显示 74 我通常也会在硬盘和驱动器盘符中报告的数量上看到这种情况 您实际可以
  • Bootstrap:固定流体布局中的装订线宽度?

    我想要不同的布局 例如 left content right 和 left content 或 content right 当使用流体布局时 单元格 之间的装订线也是流体的并且具有百分比值 但我希望左 右和内容区域之间的装订线有一个固定的宽
  • 为什么 Oracle 的 varchar 排序顺序与 varchar 比较的行为不匹配?

    一条 SQL 语句如 select from select 000000000000 as x from dual union select 978123456789 as x from dual union select B002AACD
  • Spring 5 - 如何提供静态资源

    我正在尝试在我的网络应用程序中提供静态资源 并且我尝试过 SuppressWarnings deprecation Bean WebMvcConfigurerAdapter configurer return new WebMvcConfi
  • 当 PHP 动态创建 HTTP 响应时缓存它们

    我认为我的问题看起来很随意 但请耐心等待 因为它会变得有趣 至少对我来说 考虑一个 PHP 页面 其目的是从文件系统读取请求的文件并将其作为响应进行回显 现在的问题是如何启用该页面的缓存 需要指出的是 文件可能非常大 启用缓存是为了避免客户
  • .NET Core 2.0 基本路径错误

    刚刚启动了一个新的 NET Core 2 0 应用程序 但突然出现奇怪的行为 似乎找不到任何东西 点击时会弹出如下错误 Run of my BuildWebHost System InvalidOperationException A pa
  • 加载 Roslyn 编译器生成的程序集

    我正在使用 Roslyn 编译器生成 Greeter dll 我在尝试加载 DLL 文件时出现问题 这是代码 using System using Roslyn Compilers using Roslyn Compilers CSharp
  • 如何避免多重定义链接错误?

    除了移动hello 将函数复制到另一个源 cpp 文件中或重命名该函数 还有其他方法可以避免链接错误吗 静态LibA h ifndef STATIC LIBA HEADER define STATIC LIBA HEADER int hel