33

次の例では、プログラムは次のように出力する必要があります"foo called\n"

// foo.c
#include <stdio.h>

__attribute__((constructor)) void foo()
{
    printf("foo called\n");
}

// main.c
int main()
{
    return 0;
}

プログラムが次のようにコンパイルされている場合、動作します。

gcc -o test main.c foo.c

ただし、foo.c が静的ライブラリにコンパイルされている場合、プログラムは何も出力しません。

gcc -c main.c
gcc -c foo.c
as rcs foo.a foo.o
gcc -o test foo.a main.o

なぜこれが起こるのですか?

4

2 に答える 2

18

main.oにはコードを参照していないため、リンカーは最終プログラムのfoo.aのコードを含めません。を次main.cのように書き直すと、プログラムは動作します。

//main.c

void foo();

int main()
{
    void (*f)() = foo;
    return 0;
}

また、静的ライブラリを使用してコンパイルする場合、gcc(またはリンカ)への引数の順序は重要です。ライブラリは、それを参照するオブジェクトの後に来る必要があります。

gcc -o test main.o foo.a
于 2009-07-29T19:30:42.073 に答える