Компилировать автономный exe с Cygwin - PullRequest
7 голосов
/ 04 сентября 2010

Я хочу сделать отдельный exe с Cygwin.У меня есть два варианта:

  1. Статическая ссылка cygwin1.dll
    Если я могу статически связать cygwin1.dll, то я могу получить отдельный exe.

  2. Объединить cygwin1.dll с myprog.exe
    Если я смогу объединить cygwin1.dll с моей программой, я смогу получить отдельный exe.

Не предлагайте мне использовать IlMerge.Это не будет работать, потому что я не скомпилировал свою программу с .NET.

Возможны ли какие-либо из этих вариантов?Если нет, то есть ли что-нибудь, что возможно с этой дилеммой?Thanx!

Ответы [ 3 ]

3 голосов
/ 04 сентября 2010

Попробуйте передать -mno-cygwin в качестве флага компилятора и компоновщика.Если требования вашей программы достаточно просты, этого можно избежать в зависимости от библиотек Cygwin и создать отдельный EXE-файл.

3 голосов
/ 04 сентября 2010

Я вижу две возможности, которые вы считаете разумными.Можно было бы создать исполняемый файл-заглушку с другим компилятором (например, MinGW - что угодно, просто так, чтобы он не нуждался в cygwin), чтобы распаковать основной исполняемый файл и cygwin.dll во временный каталог, а затем создать этот исполняемый файл.Чтобы распространять только один исполняемый файл, вы должны добавить основной исполняемый файл и cygwin.dll в «заглушку» в качестве бинарных ресурсов.Это немного уродливо, но довольно просто.

Альтернативой может быть захват источника в cygwin и его сборка в виде статической библиотеки.По крайней мере, теоретически, это должно быть чище, но это, несомненно, больше работы.Создание его как статического кода вместо DLL почти наверняка потребует некоторой работы, хотя трудно даже догадаться, сколько.Просто немного посмотрев, кажется маловероятным, что это будет быстрая работа за пару часов, или что-то в этом роде (если только я не пропустил что-то, что уже поддерживает статическое построение, конечно).

2 голосов
/ 25 декабря 2010

Более точный ответ Джерри.

Процедура, описанная ниже, должна противоречить вашим правам и лицензионному законодательству! Я знаю, что это может сработать, но права на распространение результата (или даже на выполнение процедуры) могут быть (и я действительно так думаю) ограничены лицензией Cygwin. Это потому, что ваше приложение будет по-прежнему ссылаться на Cygwin (даже если оно бесполезно - но все еще находится в вашем приложении)

Предположим, hello.exe - это имя вашего замечательного приложения, скомпилированного в Cygwin в каталоге отличных проектов C:\xxx\yyy\zzz\

В консоли cygwin перейдите на C:\xxx\yyy\zzz и введите

objdump -p hello.exe | grep "DLL Name"

Вы получаете все библиотеки DLL, которые использует ваше приложение. Затем скопируйте C:\xxx\yyy\zzz во все библиотеки DLL, перечисленные и специфичные для cygwin.

Обратите внимание, что ваше приложение может вызывать другие приложения (например, с помощью функции exec) - найдите приложения библиотек, которые используют приложения, и скопируйте эти библиотеки, а также сами приложения - в C:\xxx\yyy\zzz.

Возможно, вам придется перекомпилировать ваш проект с опцией вида -L C:\xxx\yyy\zzz или около того. Смотрите все другие пути в ваших источниках.

Таким образом, ваше приложение становится независимым от установки Cygwin, и вы можете представить его функциональность / поделиться им с другими пользователями Windows без Cygwin. Но - еще раз я указываю и прошу вас - знать о соответствующих лицензиях и законах создателей Cygwin и соблюдать их!

...