为什么我没有从g ++中得到“多重定义”错误?

时间:2011-01-10 02:19:31

标签: linux linker g++ definition

我尝试使用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

3 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

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

答案 2 :(得分:1)

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

它根本不会查看staticLibBstaticLibC

如果staticLibB.o包含另一个不在staticLibA中且已被拉入最终可执行文件的符号,那么您将获得hello错误的多重定义,作为单个.o个文件被拉出图书馆,其中两个将hello()。在链接命令行上颠倒staticLibAstaticLibB的顺序会使该错误消失。