Как и когда выполняется статическое связывание (MinGW)? - PullRequest
4 голосов
/ 10 декабря 2010

Мне было очень трудно связать приложение C ++ с другой библиотекой C ++ с зависимостями Fortran90 (MinGW, TDM g ++ и gfortran). Я либо должен использовать gfortran для компоновки, либо приложение запускается при запуске (в глобальных конструкторах, связанных с __cxa_get_globals_fast). Однако это не приемлемо, я хотел бы использовать g ++ для компоновки (Qt GUI).

Мне кажется, что зависимости библиотек нельзя статически связать с gcc, связывание выполняется только при наличии main() . Почему?

Я думаю, отчасти потому, что код для некоторых инициализаций должен быть вставлен перед main ().

Почему статически связанному приложению требуются DLL-ы , такие как mingwm10.dll или pthreadGCE2.dll во время выполнения? Почему они не могут быть статически связаны?

ОБНОВЛЕНИЕ: Я только что нашел эти сайты:
http://www.deer -run.com / ~ гал / золь-static.txt
http://www.iecc.com/linker/

Ответы [ 2 ]

1 голос
/ 20 марта 2011

Почему статически связанному приложению требуются библиотеки DLL, такие как mingwm10.dll или pthreadGCE2.dll во время выполнения?Почему они не могут быть статически связаны?

Они могут, но статические версии библиотек не предоставляются из-за фундаментального преимущества динамических библиотек: ошибки могут быть исправлены без перекомпоновки исполняемых файлов.

1 голос
/ 10 декабря 2010

Основное различие между связыванием с gfortran и использованием ld / gcc / g ++ для связывания заключается в том, что gfortran связывает стандартные библиотеки fortran по умолчанию, тогда как с другим компоновщиком вам нужно будет вручную указать библиотеки для связывания.Я не смог найти их с помощью быстрого поиска, но он должен быть похож на -lgfortran.

Кроме того, у gfortran есть некоторые конкретные инструкции для процедур инициализации , которые необходимопризвал к тому, чтобы определенные встроенные функции Fortran работали, если ваша основная программа не написана на Fortran.Если вы не вызывали эти процедуры, это может привести к сбою.

...