2010-09-03 4 views
8

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

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

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

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

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

+0

Я полагаю, что на самом деле вам нужны услуги от CYGWIN.DLL, и просто использование -Mno-cygwin (или MinGW) не сработает для вас? – RBerteig

+0

Не знаю. Я использую GCJ, но я не мог получить GCJ, который пришел с mingw для работы. –

ответ

3

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

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

3

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

+1

Другие сообщения указали, что это больше не работает, для более свежих читателей. Функция теперь устарела. – eewanco

1

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

Процедура, описанная ниже, должна соответствовать вашим правам и лицензионному праву! Я знаю, что это может работать, но права на распространение результата (или даже выполнение процедуры) могут быть (и я действительно чувствую, что есть) ограничены лицензией 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 и наблюдайте за ними!

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