0

実行可能ファイルと[lib*.so]ライブラリを引数として取り、@Run-timeにリンクするコードを作成しました。

(* .o)ファイル@ランタイムの関数も取り込んでリンクしたいと思います。しかし、私はそれについてどうやって行くのか分かりません。

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

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

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

#include <stdio.h>
#include <unistd.h>
#include <dlfcn.h>    // 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);
}
4

3 に答える 3

1

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

于 2010-10-02T13:08:45.930 に答える
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/にインストールする必要があります。詳細についてはこちらをご覧ください。

于 2010-10-02T19:40:34.037 に答える
1

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

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]);
于 2010-10-03T05:16:54.493 に答える