0


0

C(lib * .so)ライブラリの動的リンク

実行可能ファイル_と[lib * .so]ライブラリを引数として受け取り、@ランタイムをリンクするコードを記述しました。

また、(。o)ファイル@ランタイムの*関数を取り込み、リンクしたい。 しかし、私はそれについてどうやって行くのか分からない。

*編集1:*リンクしようとしている関数は、lib * .soライブラリーの.oファイルの一部です。 _だから、ライブラリ名と、同じライブラリ@ Run-Timeにある関数名も指定したい。

例えば。 ライブラリに2つの関数(* .oファイル)が含まれている場合、リンカーは@ Run-Timeを使用する関数をコンパイルする必要があります。

私はコードを投稿しました、助けてください:

#include
#include
#include     // use -ldl

typedef float (*DepFn)(short, short);

int main(int argc, char* argv[])
{
    void* lib;
    DepFn df;

    if(argc < 2)
        return printf("USAGE: %s lib-file\n", argv[0]);

    lib = dlopen(argv[1], RTLD_NOW);
    if(lib == NULL)
        return printf("ERROR: Cannot load library\n");

    df = dlsym(lib, "Depreciation");
    if(df)
    {
        short l, i;

        printf("Enter useful-life of asset: ");
        scanf("%hd", &l);

        for(i = 1; i <= l; i++)
        {
            float d = 100 * df(l, i);
            printf("%hd\t%.1f%%\n", i, d);
        }
    }
    else
        printf("ERROR: Invalid library\n");

    dlclose(lib);
}

3 Answer


1


標準関数を使用して実行時に再配置可能( * .o)をロードすることはできません。 オブジェクトが位置に依存しないコードとしてコンパイルされていることを確認する必要があります(例: -fPIC)そして、そこから共有オブジェクトを作成します。 「ld -shared -o foo.so foo.o」のようなものがトリックを行うかもしれません。


1


コメントに基づいて、共有ライブラリにリンクするだけで、

コードを次のように変更します。

extern float Depreciation(short i,k); //should rather go in a header file

int main(int argc, char* argv[])
{
    short l, i;

        printf("Enter useful-life of asset: ");
        scanf("%hd", &l);

        for(i = 1; i <= l; i++)
        {
            float d = 100 * Depreciation(l, i);
            printf("%hd\t%.1f%%\n", i, d);
        }
    }

共有ライブラリをコンパイルしてリンクします。

 gcc -o myprogram myprogram.c -lXX

libXX.soをインストールする必要があります。 / usr / lib /が機能するための詳細については、http://tldp.org/HOWTO/Program-Library-HOWTO/ [こちら]を参照してください。


1


実行時に関数名を取得する必要がある場合は、argv [2]で渡す必要があり、 `dlsym`でfunction-nameをハードコーディングする代わりにargv [2]を使用します。

if(argc < 3)
        return printf("USAGE: %s lib-file function-name\n", argv[0]);

    lib = dlopen(argv[1], RTLD_NOW);
    if(lib == NULL)
        return printf("ERROR: Cannot load library\n");

    df = dlsym(lib, argv[2]);