纵横交错地考查C++功底 [3]

问题现象:
在公司里运行UnitTest的时候,发现运行时出现undefined symbol: 问题,后来经过检查发现是链接的时候多加了一个编译选项,导致链接并没有检查到没有link进去的库.

// so.h
void func();

// so.c
#include "so.h"
#include "stdio.h"
void func()
{
    printf("func\n");
}

// so2.h
void hhh();

// so2.c
#include "so.h"
#include "stdio.h"
void hhh(){
    printf("hhh\n");
    func(); // call the method in so.h
}

// main.c
#include "so2.h"
int main()
{
    hhh();
    return 0;
}




情况1:(正常情况下)
gcc -shared -fPIC -o libso.so so.c
gcc -shared -fPIC -o libso2.so -L. -lso so2.c
gcc -o test -L. -lso2 main.c
./test


运行正常
因为编译so2的时候让它依赖so,所以链接的时候即使不写-lso也可以

情况2:(正常情况下)
gcc -shared -fPIC -o libso.so so.c
gcc -shared -fPIC -o libso2.so so2.c # comment -L. -lso
gcc -o test -L. -lso -lso2 main.c # add -lso
./test


运行正常
编译so2的时候没有显式依赖so,所以链接的时候要显式-lso -lso2

情况3:(错误情况下)
gcc -shared -fPIC -o libso.so so.c
gcc -shared -fPIC -o libso2.so so2.c
gcc -o test -L. -lso2 main.c
./test


链接报错:
./libso2.so: undefined reference to `func'
collect2: ld returned 1 exit status


因为没有显式告知如何链接libso.so所以找不到func的定义

最复杂的一个例子:
情况4:(错误情况下)
gcc -shared -fPIC -o libso.so so.c
gcc -shared -fPIC -o libso2.so so2.c
gcc -Wl,--allow-shlib-undefined -o test -L. -lso2 main.c
./test


编译链接成功,运行报错:
hhh
./test: symbol lookup error: ./libso2.so: undefined symbol: func


因为带上了-Wl,--allow-shlib-undefined选项,让编译时允许未定义的符号,结果运行时找不到相关lib,就报错了

参考资料:
http://hi.baidu.com/widebright/item/3ed0b426a81daecedcf69ad0
http://stackoverflow.com/questions/2356168/force-gcc-to-notify-about-undefined-references-in-shared-libraries



你可能感兴趣的:(纵横交错地考查C++功底 [3])