Использование научной библиотеки GNU (GSL) под Windows x64 с MinGW

я установил MinGW и MSYS в Microsoft Windows (64bit), внутри каталога C:MinGW (каталог MSYS C:MinGWmsys.0). Я загрузил последнюю научную библиотеку GNU (GNU GSL пакета) от официальный ftp.

я использовал MSYS для выполнения configure и make успешно, как описано в INSTALL файл в пакете GSL. Это означает, что в командной строке префикса msys интерфейс, в префикса msys Я вставлено:

$ ./configure
$ make
$ make install

это производит local каталог в каталоге MSYS (C:MinGWmsys.0), в том числе каталоги bin, include, lib и share.

я успешно скомпилировал пример программы (который вычисляет значение функции Бесселя $J_0 (x)$ при $x = 5$) в соответствии с инструкциями в руководство GSL, by

$ gcc -Wall -I/usr/local/include -c example.c

это приводит к объектному файлу example.o, как ожидалось, без каких-либо сообщений об ошибках.

объектный файл связан, согласно - инструкции by

$ gcc -L/usr/local/lib example.o -lgsl -lgslcblas -lm

это создает исполняемый файл a.exe который может быть выполнен в среде MSYS. Однако в интерфейсе командной строки Windows cmd.exe, попытка запустить исполняемый файл дает следующее сообщение об ошибке:

программа не может запуститься, потому что libgsl-0.dll отсутствует на вашем компьютере. Попробуйте переустановить программу устранение этой проблемы.

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

4 ответов


когда вы строите проекты для MinGW, под MSYS, вы должны всегда указать до ./configure; (the /usr/local default указывает конкретный путь MSYS,который полностью непригоден для разработки приложений MinGW). В вашем случае вы должны были настроить GSL таким образом:

./configure --prefix=C:/MinGW

или, еще лучше, отделите файлы сборки от источников (например, как подкаталог верхнего исходного каталога GSL):

mkdir build
cd build
../configure --prefix=C:/MinGW

это гарантирует что все библиотеки и заголовки, установленные пакетом, расположены в соответствующих каталогах, где MinGW может их найти, и, что более важно, где установленные DLL находятся %PATH% поиск, при запуске за пределами MSYS.

путем настройки, как вы сделали, когда вы впоследствии побежали

make
make install

вы установили библиотеки и заголовки MinGW для использования MSYS (что неправильно), и в частности libgsl-0.dll будет установлен в C:/MinGW/msys/1.0/local/bin, тогда как он должны находиться в C:/MinGW/bin, (где последняя команда б установили его, следуя конфигурации с соответствующими --prefix=C:/MinGW спецификация).

Важная Сноска

вы должны отметить, что предыдущая процедура правильно подготовит GSL (или любую другую библиотеку, подготовленную аналогичным образом) для использования с MinGW и позволит вам запускать приложения, которые вы связали с такими библиотеками на вашем хост разработки (или на любом другом хосте с аналогичной установкой MinGW). Однако, если вы хотите распространять такие приложения (и при условии соблюдения любых условий лицензирования), чтобы они могли запускаться как самостоятельные приложения (т. е. без требования установки MinGW на компьютере конечного пользователя), вы должны позаботьтесь о том, чтобы зависимости времени выполнения были правильно удовлетворены в вашем дистрибутиве. Чтобы достичь этого, вы должны выбрать либо кому:

  1. ссылка на приложение статически. Это может быть уместно, если ваш дистрибутив ограничен одним или, возможно, двумя исполняемыми файлами, но быстро приведет к "исполняемому раздуванию", поскольку количество исполняемых файлов с общей зависимостью от библиотеки ядра увеличивается в пределах распространяемого пакета приложений. В последнем случае лучшим выбором было бы
  2. ссылка на приложение динамически, и распространять копии всех необходимых Dll, (кроме системных DLL), вместе с пакетом приложений; в этом случае вы не должны делать никаких предположений относительно макета каталога или %PATH% настройки, которые могут или не могут применяться на компьютере конечного пользователя; вы должны просто упаковать свой дистрибутив так, чтобы все доставленные исполняемые файлы и сопровождающие их библиотеки DLL были установлены в один и тот же.

Я нашел частичное решение, но я не знаю точно, почему это работает!

С то же самое процедура и конфигурация, которые я упоминал первоначально в вопросе, если используется Windows cmd (CLI) и один компилирует и связывает код C (example.c) С

gcc -c example.c -I"C:\MinGW\msys.0\local\include" -Wall
gcc -static example.o -L"C:\MinGW\msys.0\local\lib" -lgsl -lgslcblas -lm

или код C++ (эквивалентно example.c) С

g++ -c example.cpp -I"C:\MinGW\msys.0\local\include" -Wall
g++ -static example.o -L"C:\MinGW\msys.0\local\lib" -lgsl -lgslcblas -lm

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

пожалуйста, поправьте меня, если я ошибаюсь.


исполняемый файл не запускается под windows cmd потому что библиотека libgsl-0.DLL вы составлены не по системе или путем пользователя. В Windows не знаю, где его искать. Немедленное решение-сообщить системе где его найти, отредактировав путь переменной среды, чтобы включить расположение libgsl-0.файл DLL. Это можно сделать с помощью cmd введя

PATH=PATH;path-to-libgsl-0.dll

в командной строке. (Я точно не помню, куда ведет библиотека. так прошу прощения, что не уточняю.) Это будет продолжаться только в течение сессии, хотя, и чтобы сделать изменение постоянным, необходимо отредактировать переменную PATH с помощью проходим через Панель управления. Один из способов доступа к переменным среды это, нажав на "дополнительные системные настройки", которые можно найти слева в окно в результате щелчка по панели управления - >Система и безопасность - >Система или щелкнув правой кнопкой мыши на компьютере в меню "Пуск" и выбрав Свойства. Нажатие в разделе "Дополнительные настройки системы" откроется окно, в котором появляется кнопка "Переменные среды", и переменные среды становятся можно нажав на эту кнопку. Чтобы отредактировать путь, я бы рекомендуем использовать бесплатную утилиту " PathEditor.exe", который можно найти здесь. Эта утилита делает процесс намного проще.

ваша настройка сборки далека от оптимальной. С помощью .configure шаг без каких-либо вариантов означает, что сгенерированные файлы будут быть установленным под C:\MinGW\msys\1.0\local и распространено над несколькими справочники. Будет трудно удалить файлы, если вы хотите установить более новая версия GSL после установки также другие разработка библиотек. Я бы рекомендовал добавить опцию --prefix=C:/MinGW/gsl к .configure шаг. (Для полного набора опций запустите .configure --help.) Это делает его очень легким получить установку в случае необходимости, просто удалив или переименовав C:\MinGW\gsl - ... Кроме того, цель MSYS Is для облегчения создания программного обеспечения для систем GNU, которые не являются способом Windows. Программное обеспечение после сборки не должен находиться под MSYS, а скорее где-то под C:\MinGW и сделал доступный для инструменты сборки в C:\MinGW\bin которые используются для создания собственных программ Windows используя cmd или другие подходящие инструменты Windows. На практике это означает, что --prefix=C:/MinGW следует всегда использовать, если MSYS необходимо создайте программное обеспечение для использования в MinGW, как в этом случае файлы заголовков GSL и библиотеки. Предпочтительно, однако, по приведенным причинам выбрать --prefix=C:/MinGW/software.

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


Это не так просто. gcc запускается из командной строки LINUX в оболочке bash. MinGW32-gcc запускается из командной строки DOS в cmd.exe оболочки. Динамическая компоновка, необходимая для выполнения программы, которая нуждается в динамической библиотеке ссылок (.dll в DOS или .Итак .la в Linux) также зависит от ОС. Линукс динамических библиотек и динамических библиотек Windows не заменимы. Это ожидаемо; однако статические библиотеки, созданные gcc и ld в Linux ' bash shell, кажется, несовместимы с MinGW32-gcc в cmd Windows.exe shell и это меня удивляет. Я не могу заставить MinGW32-gcc ссылаться на libgsl.a; я продолжаю получать неразрешенные ссылки от ld. Я также не могу понять, как заставить GSL строить в cmd.exe оболочки.