14

静的ライブラリから共有オブジェクトを生成するのに問題があります。他にも選択肢があることはわかっていますが、これが機能しない理由と機能させる方法に悩まされています(行き詰まっているのではなく)。

以下は私が使用している非常に単純なソースコードです。

get_zero.c

#include "get_zero.h"

int
get_zero(void)
{
        return 0;
}

get_zero.h

int get_zero(void);

main.c

#include <stdio.h>
#include <string.h>

#include "get_zero.h"

int
main(void)
{
    return get_zero();
}

目標は、libget_zero_staticとlibget_zero_sharedを使用して機能的に等しい2つのアプリケーションを作成することです。

これが私のコンパイル/リンクのステップです:

gcc -c -fPIC get_zero.c
ar cr libget_zero_static.a get_zero.o
gcc -shared -o libget_zero_shared.so -L. -Wl,--whole-archive -lget_zero_static -Wl,-no--whole-archive

そして、これは私が得るエラーです:

/usr/bin/ld: cannot find -lgcc_s
/usr/bin/ld: /usr/lib/gcc/x86_64-linux-gnu/4.6/../../../x86_64-linux-gnu/libc.a(init-first.o): relocation R_X86_64_32 against `_dl_starting_up' can not be used when making a shared object; recompile with -fPIC
/usr/lib/gcc/x86_64-linux-gnu/4.6/../../../x86_64-linux-gnu/libc.a(init-first.o): could not read symbols: Bad value
collect2: ld returned 1 exit status

これは64ビットのUbuntuシステム上にあります。

ここでアーカイブ全体のオプションについて読みましたが、この質問ですべての障害が取り除かれたはずです。 静的ライブラリから共有オブジェクトファイルを作成する方法

4

2 に答える 2

18

ライブラリとしてではなく、引数としてアーカイブを指定する必要があるようです。したがって、libget_zero_static.aの代わりにそれを作成し-lget_zero_staticます。少なくともそれは私にとってこのように機能します:

gcc -shared -o libget_zero_shared.so \
-Wl,--whole-archive                  \
libget_zero_static.a                 \
-Wl,--no-whole-archive
于 2012-11-11T16:29:39.687 に答える
3

別の方法を試すことができます。1つは静的ライブラリ用、もう1つは共有ライブラリ用の2回リンクします。それはもっと簡単で一般的なはずです。

于 2012-11-11T15:22:28.567 に答える