【问题标题】:Why I'm not getting "Multiple definition" error from the g++?为什么我没有从 g++ 中得到“多重定义”错误?
【发布时间】:2011-01-10 02:19:30
【问题描述】:

我尝试使用 g++ 将我的可执行程序与 2 个静态库链接。 2 个静态库具有相同的函数名。我期待链接器出现“多重定义”链接错误,但我没有收到。谁能帮忙解释一下为什么会这样?

staticLibA.h

#ifndef _STATIC_LIBA_HEADER
#define _STATIC_LIBA_HEADER

int hello(void);

#endif

staticLibA.cpp

#include "staticLibA.h"

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

输出:

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

staticLibB.h

#ifndef _STATIC_LIBB_HEADER
#define _STATIC_LIBB_HEADER

int hello(void);

#endif

staticLibB.cpp

#include "staticLibB.h"

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

输出:

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);

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

输出:

g++ -c  -o main.o main.cpp
g++ -o multipleLibsTest main.o  -L. -lstaticLibA -lstaticLibB -lstaticLibC -ldl -lpthread -lrt

【问题讨论】:

  • 运行程序时hello() 打印什么?我会假设链接顺序决定了答案。也就是说,-lstaticLibA -lstaticLibB 会给出与-lstaticLibB -lstaticLibA 不同的答案。
  • 我很抱歉。我不会如何编辑我的帖子,所以我在"How to avoid multiple definition linking error 发布了一个新问题

标签: linux linker g++ definition


【解决方案1】:

链接器不会查看staticLibB,因为在链接staticLibA 时,没有未实现的依赖项。

【讨论】:

    【解决方案2】:

    这很容易。如果引用的符号尚未定义,则仅从库中提取对象。只有一个 hello 被拉出(从 A 中)。如果您链接到 .o 文件,则会出现错误。

    【讨论】:

      【解决方案3】:

      当链接器尝试将main.o 链接到multipleLibsTest 并发现hello() 未解析时,它会按照命令行中给出的顺序开始搜索库。它将在staticLibA 中找到hello() 的定义并终止搜索。

      它根本不会查看staticLibBstaticLibC

      如果staticLibB.o 包含另一个不在staticLibA 中的符号,并且该符号被拉入最终的可执行文件,那么您会得到hello 的多重定义错误,因为单个.o 文件被拉出库和两个其中有hello()。在链接命令行上颠倒staticLibAstaticLibB 的顺序,就会消除该错误。

      【讨论】:

        猜你喜欢
        • 2012-11-21
        • 2018-06-06
        • 1970-01-01
        • 2018-02-21
        • 2018-10-03
        • 1970-01-01
        • 2013-01-17
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多