忍者ブログ
  • 2017.09
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 2017.11
gccリンカの謎
gccの-lオプションが効かない時があるのでその原因を確かめてみた。


$ gcc  pp4.c pp.c pp2.c
/tmp/ccj9EogJ.o: In function `func':
pp2.c:(.text+0x7): undefined reference to `link2'
/tmp/cchGaury.o: In function `main':
pp.c:(.text+0x11): undefined reference to `link1'
collect2: ld はステータス 1 で終了しました

こんなソースがある場合、link1とlink2を含むlibpp3.soで解決する必要がある
当初、ソース1個以上指定した後の-lオプションのみが有効かと思いきや
リンクメッセージがないと-lが効かないという話を教えてもらったので試してみた。

$ gcc  pp4.c -l pp3 pp.c pp2.c
/tmp/ccj9EogJ.o: In function `func':
pp2.c:(.text+0x7): undefined reference to `link2'
/tmp/cchGaury.o: In function `main':
pp.c:(.text+0x11): undefined reference to `link1'
collect2: ld はステータス 1 で終了しました

あら、ほんとだ。pp4.cはlink1もlink2も依存していないため
これでもエラーが起こる・・・。

$ gcc  pp4.c pp.c -l pp3 pp2.c


では、link1に依存するpp.cの後に-l pp3を移動させると
エラーはなくなった~

てっきり
/tmp/ccj9EogJ.o: In function `func':
pp2.c:(.text+0x7): undefined reference to `link2'
みたいなのが出ると思ったのだけどそうでもないらしい。
つまり・・・
-lオプションは最後に書けということですなぁ。

バージョンによっては直ってるgccもあるらしい。

pp.c
int link1();
int func();
int func2();
int main(const int argc, char *argv[])
{
	func();
	func2();
	return link1();
}
pp2.c
int func()
{
	return link2();
}
pp3.c
int link1()
{
	return 1;
}

int link2()
{
	return 2;
}
pp4.c
int func2()
{
	return 2;
}
PR
【2013/02/16 20:23 】 | C/C++ | 有り難いご意見(0)
                                    
<<gccリンカの謎(2) | ホーム | 列数をA1形式の列文字に変換>>
有り難いご意見
貴重なご意見の投稿














<<前ページ | ホーム | 次ページ>>