2010-12-10 2 views
4

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

Мне кажется, что зависимости библиотек не могут быть скомпонованы статически с НКУ, компоновка выполняется только тогда, когдаmain()доступен. Зачем?

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

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

UPDATE: Я только что нашел эти сайты:
http://www.deer-run.com/~hal/sol-static.txt
http://www.iecc.com/linker/

ответ

1

Основное различие между соединением с gfortran и использованием л.д./ССАГПЗ/г ++ для связи является то, что gfortran связывает стандартные FORtran библиотеки по умолчанию , тогда как с другим компоновщиком вам нужно будет вручную указать библиотеки для связи. Я не смог найти их с быстрым поиском, но он должен быть в порядке -lgfortran.

Кроме того, gfortran имеет некоторые конкретные instructions for initialisation routines, которые должны быть вызваны для того, чтобы определенные fortran intrinsics работали, если ваша основная программа не записана в fortran. Если вы не вызвали эти процедуры, это может привести к сбою.

+0

Вы имеете в виду это? Основная программа Non-Fortran: http://gcc.gnu.org/onlinedocs/gfortran/Non_002dFortran-Main-Program.html Вот обратная ссылка моего приложения: # 0 0x00777520 в глобальных конструкторах, привязанных к __cxa_get_globals_fast() # 1 0x0077ef87 в __do_global_ctors() # 2 0x0040122a в __mingw_CRTStartup() # 3 0x00401298 в mainCRTStartup() – Ali 2010-12-10 12:49:42

1

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

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

+0

Не могли бы вы рассказать мне, как это можно связать статически? Должен ли я создавать свою собственную статическую библиотеку из источника? – Ali 2011-03-20 23:28:53

Смежные вопросы