10

3つのCソースファイルがあるとします。最初の2つはLIB(lib * .a?)であり、3つ目はそれらを使用するアプリケーションです。

最初は(re.c)です:

int re(int i) {
    return i;
}

2番目は(test.c)です:

int re(int); // Depends on re.c

int test(int i) {
    return re(i);
}

そして3番目は(main.c)です:

#include<stdio.h>

int test(int); // Uses test.c

int main(void) {
    
    printf("%d\n",test(0));
    return 0;
}

では、最初の2つのLIBを、後でメインアプリケーションと静的にリンクできるように作成するにはどうすればよいですか?

DLLを作成し、次のようなアプリケーションで動的にリンクする方法を知っています。

cc -o re.dll re.c -shared -Wl、--out-implib = libre.a(re.cの場合)

cc -o test.dlltest.c-L。-lre -shared -Wl、--out-implib = libtest.a(test.cの場合)

cc -o main.exemain.c-L。-lre -ltest


では、MinGWの実行可能バイナリ内で静的にリンクされる同等のLIBを作成する方法と、それらをリンクする方法は?

明らかに、Windowsでは:)

4

3 に答える 3

16

私はここで解決策を見つけました:http://www.codeproject.com/Articles/84461/MinGW-Static-and-Dynamic-Libraries

アイデアは、リンクせずにすべてのライブラリ(ソースファイル)をコンパイルすることです。次に、出力オブジェクトを変換しますar rcs -o lib*.a *.o。ここで、*は作成されたオブジェクトの名前です(オブジェクトを1つずつ変換します)。その後、アプリケーションをコンパイルし-L.てディレクトリを指定し、-l*GNU命名装飾なしでライブラリ名を指定します。

他のライブラリに依存するライブラリの場合、最初に指定してから参照ライブラリを指定する必要があります。そうしないと、テストライブラリが再ライブラリを参照するため、私undefined reference to reが行ったときに発生するようなエラーが発生します。-lre -ltest-ltest -lre

これが私がそれをコンパイルした方法です:

cc -c -o test.o test.c

cc -c -o re.o re.c

ar rcs -o libtest.a test.o

ar rcs -o libre.a re.o

cc -o main.exemain.c-L。-ltest -lre

TinyCコンパイラでも動作します。

于 2012-05-27T16:45:49.910 に答える
1

オプションを使用してみましたか:-static -mwindows

于 2012-05-27T15:46:57.863 に答える
0

ガサンの答えに追加します。(すべての%.aファイルとオブジェクトファイルが使用可能な場合は、静的にビルドすることができます)

lib /ディレクトリ(すべて%.aファイル)で確認できるように、mingwのほとんどのライブラリは静的です。私の場合、共有依存関係はlibstd ++-6.dllとlibgcc_s_dw2-1.dllのみであり、静的ライブラリにはまったく存在しません。

これらの2つの共有ライブラリがないと、実行可能ファイルを実行できませんでした。説明が読むように、

これは自由に再配布可能なライブラリです。ビルド時に共有ランタイムライブラリのサポートが明示的に無効にされていない限り、GNU C ++言語コンパイラによってコンパイルされたすべてのアプリケーションで必要になります(配布する必要があります)。

于 2018-02-26T21:09:47.707 に答える