縦横に交錯してC++の基礎を考査[3]
2043 ワード
問題:
会社でUnitTestを実行していたとき、undefined symbol:問題が発生したことに気づき、その後、チェックしたところリンクであることが判明したときにコンパイルオプションが追加され、リンクはlinkが入っていないライブラリを検査しなかった.
ケース1:(通常)
正常に動作
so 2をコンパイルするときはsoに依存させるので、リンクするときは-lsoを書かなくてもいいです
ケース2:(通常)
正常に動作
so 2をコンパイルするときは明示的にsoに依存しないので、リンクするときは明示的-lso-lso 2
ケース3:(エラーの場合)
リンクエラー:
libsoへのリンク方法を明示的に知らなかったからです.soだからfuncの定義が見つからない
最も複雑な例:
ケース4:(エラーの場合)
リンクのコンパイルに成功しました.エラーメッセージを実行しました.
-Wl、--allow-shlib-undefinedオプションが付いているため、コンパイル時に未定義の記号を許可し、結果として実行時に関連libが見つからず、エラーを報告しました.
参考資料:
会社でUnitTestを実行していたとき、undefined symbol:問題が発生したことに気づき、その後、チェックしたところリンクであることが判明したときにコンパイルオプションが追加され、リンクはlinkが入っていないライブラリを検査しなかった.
// so.h
void func();
// so.c
#include "so.h"
#include "stdio.h"
void func()
{
printf("func
");
}
// so2.h
void hhh();
// so2.c
#include "so.h"
#include "stdio.h"
void hhh(){
printf("hhh
");
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
正常に動作
so 2をコンパイルするときは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
正常に動作
so 2をコンパイルするときは明示的にsoに依存しないので、リンクするときは明示的-lso-lso 2
ケース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