Как мне статически включить библиотеку в g ++? - PullRequest
5 голосов
/ 13 декабря 2011

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

Я понимаю, что после нескольких лет курсов и проектов CS и тому подобного мне никогда не требовалось экспортировать исполняемый файл, который кто-то другойможет работать без компиляции исходного кода вручную (что делают большинство / все профессора / TA, так как они все равно хотят видеть ваш исходный код).

Поэтому мой вопрос в основном таков:

КогдаЯ компилирую некоторый базовый код C ++ (например, код «Hello World»), мне всегда нужны какие-то внешние библиотеки DLL для его запуска.

  • Visual Studio требуется .NET Framework.
  • Cygwin нужен Cygwin.dll.
  • MinGW нужен libgcc_s_dw2-1.dll или что-то подобное.

Итак, как мне просто скомпилировать исполняемый файл так, чтобы я (или кто-то, кому я дал)файл) может просто дважды щелкнуть по нему и запустить?Я предполагаю, что есть некоторые причудливые флаги командной строки, которые я могу использовать на g ++ для статической связи библиотек DLL;Мне просто никогда не приходилось делать это раньше.

Как я уже дважды говорил, это вопрос супер-новичка, и, тем не менее, я не мог найти (во всяком случае, легко) ответ на этот вопрос, StackOverflow или где-либо еще.Во многом, я думаю, потому что поисковые термины так часто используются в описаниях для других проблем.

В любом случае, вся помощь приветствуется.

РЕДАКТИРОВАТЬ:

Яв буквальном смысле говорить о программе Hello World.Например:

HelloWorld.cpp:

#include <iostream>
using namespace std;

int main()
{
    cout << "Hello World!" << endl;

    return 0;
}

Ответы [ 4 ]

1 голос
/ 13 декабря 2011

Однако, как правило, следует избегать статического связывания .Почти все утилиты на обычной машине с Linux динамически связаны: вы можете использовать file или ldd, чтобы узнать, статически ли связан исполняемый файл.В моей системе Debian / Sid /usr/bin/ содержит 7303 файла, но только один статически связан (это /usr/bin/rar).

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

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

1 голос
/ 13 декабря 2011

Попробуйте g ++ -static -static-libgcc

0 голосов
/ 03 ноября 2013

Вот как: Проще говоря, вы указываете связать все стандартные вещи в ваш исполняемый файл.

g++ -o c:\prog.exe c:\HelloWorld.cpp -static-libgcc -static-libstdc++

надеюсь, это поможет.

0 голосов
/ 13 декабря 2011

Если у вас уже есть статическая библиотека, в которую нужно связать (.lib или .a), просто соедините их вместе с объектными файлами при связывании вашего приложения, например

g ++ foo.o libfoo.a -o foo

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

...