Вопрос по mingw – Статически связываемые библиотеки в MinGW

8

Предположим, у меня есть три исходных файла на Си. Первые два - LIB (lib * .a?), А третье - приложение, которое их использует.

Первый (re.c):

int re(int i) {
    return i;
}

Второй (test.c):

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

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

И третий (main.c):

#include<stdio.h>

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

int main(void) {

    printf("%d\n",test(0));
    return 0;
}

Как теперь я могу создать первые две LIB таким образом, чтобы я мог статически связать их позже с основным приложением?

Я знаю, как создавать библиотеки DLL и динамически связывать их в моем приложении, например:

cc -o re.dll re.c -shared -Wl, - out-implib = libre.a (для re.c)

cc -o test.dll test.c -L. -lre -shared -Wl, - out-implib = libtest.a (для test.c)

cc -o main.exe main.c -L. -lre -ltest

Как создать эквивалентные LIB для статической связи в моем исполняемом двоичном файле в MinGW и как их связать?

Очевидно, под Windows

Ваш Ответ

2   ответа
12

http: //www.codeproject.com/Articles/84461/MinGW-Static-and-Dynamic-Librarie

Идея состоит в том, чтобы скомпилировать все библиотеки (исходные файлы) без ссылок. Затем преобразование выходных объектов с помощьюar rcs -o lib*.a *.o где * - имя созданных объектов (преобразует их один за другим). После этого мы просто скомпилируем приложение с-L. для указания каталога и с-l* для указания имен библиотек без декорирования имен GNU.

Для тех библиотек, которые зависят от других, их нужно сначала указать, а затем ссылочные библиотеки, либо ошибки типаundefined reference to re произойдет, когда я сделал-lre -ltest, где-ltest -lre является правильным, потому что тестовая библиотека ссылается на повторную библиотеку.

Вот как я это скомпилировал:

cc -c -o test.o re.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.exe main.c -L. -ltest -lre

Это все, так работает для Tiny C Compiler.

0

если доступны все файлы% .a и объектные файлы).

Большинство библиотек в mingw являются статическими, как я вижу в каталоге lib / (все файлы% .a). В моем случае разделяемыми зависимостями являются только libstd ++ - 6.dll и libgcc_s_dw2-1.dll, которых вообще нет в статической библиотеке.

Я не смог запустить свой исполняемый файл без этих двух общих библиотек. Как следует из описания,

Это свободно распространяемая библиотека; это требуется (и вы должны распространять его) любым приложением, скомпилированным компилятором языка GNU C ++, если только поддержка общих библиотек времени выполнения явно отключена при сборке.

Похожие вопросы