C ++ - создание статического вопроса библиотеки - PullRequest
2 голосов
/ 21 августа 2010

Я собрал libbz2 (статический вариант) с использованием системы компиляции MinGW (GCC 4.5.0) и теперь пытаюсь импортировать эту библиотеку в мой проект MSVS2008.

Я сделалэти вещи уже и все работало нормально, например, с zlib (что означает, что созданные библиотеки C фактически взаимозаменяемы).

Однако, делая то же самое с libbz2, я сталкиваюсь с некоторыми неизвестными проблемами -Когда я компилирую свой MSVS2008-проект, я получаю следующую ошибку на этапе компоновки:

unresolved external symbol ___chkstk referenced in function _bzopen_or_bzdopen

Я не знаю, почему это происходит (я думаю, это потому, что некоторые базовые среды выполнения C неполностью совместимо), но, может быть, кто-то знает, как исправить такую ​​ошибку?

Может быть, есть ручной способ как-то объединить реализацию ___chkstk на основе MinGW сlibbz2 статическая библиотека?

Спасибо.

Ответы [ 3 ]

2 голосов
/ 21 августа 2010

Я прочитал ваш ответ, но я думаю, что есть более простой (автоматический) способ ручного объединения объектных файлов: используйте CFLAG -static-libgcc, который будет связывать необходимые функции (то, что вы описываете и делаете вручную) .

2 голосов
/ 21 августа 2010

Спасибо всем, я нашел ответ.

В принципе, вы можете просто ссылаться на libgcc.a / libgcc.lib, который использовался при сборке библиотеки.

Чем удобнееспособ решения проблемы ___chkstk означает только выполнение чего-то вроде ar x libgcc.a (который производит много файлов .o), а затем объединение ваших libbz2 объектных файлов с файлом __chkstk.o.

0 голосов
/ 17 февраля 2012

Я думаю, что это должно быть в опциях компоновщика, например, LDFLAGS = -static , в то время как LDFLAGS = -static-libgcc по-прежнему дает динамически связанные двоичные файлы ... с любым test.c:

gcc -c test.c
gcc -static-libgcc test.o
ldd a.out
    libc.so.6 => /lib64/libc.so.6
    /lib64/ld-linux-x86-64.so.2

gcc -c test.c
gcc -static test.o
ldd a.out
    not a dynamic executable

Для библиотекаря просто используйте ar

ar q libtest.a <path>/libgcc.a
...