Могу ли я перекомпилировать файл с новым кодом? - PullRequest
1 голос
/ 09 мая 2011

У меня есть вопрос.Мне было интересно, если вы могли бы заново скомпилировать код с другой частью кода.Например (теоретический):

main.c:

#include <stdio.h>

void showme();

int main()
{
   showme();
}

void showme()
{
   fprintf(stderr, "errtest, show me");
}

Скомпилируйте этот файл в main.(Таким образом, основной компилируется) После этого я хочу добавить кусок кода.

addthis.c:

void test()
{
   test();
}

Теперь я хочу использовать (скомпилированный) основной и повторноскомпилируйте его с помощью addthis.c.При его запуске (./mainWithAddthis) должен показывать отпечаток 2 раза.

Надеюсь, я все объяснил ясно.У кого-нибудь есть идея?

Ответы [ 5 ]

6 голосов
/ 10 мая 2011

Вам нужна предварительная декларация для void test(), как и для void showme(). Скомпилируйте каждый .c файл с параметром -c (только компиляция):

  • gcc -c addthis.c -o addthis.o
  • gcc -c main.c -o main.o

Затем свяжите два объектных файла с помощью:

  • gcc main.o addthis.o -o main

Тогда наслаждайся ./main: -)

2 голосов
/ 10 мая 2011

Ваш первый код не будет компилироваться, так как нет определения test();.

Как я понимаю, вы хотите взять скомпилированный main и добавить его с кодом, сгенерированным для addthis.o для создания второго приложения с именем mainWithAddthis.Это невозможно!

Вы либо сбиты с толку, либо пытаетесь сделать какой-то хардкорный трюк.

0 голосов
/ 10 мая 2011

main.c

void f();
int main()
{
  f();
  return 0;
}

addon1.c

#include <stdio.h>
void f()
{
  printf("I am the ONE.\n");
}

addon2.c

#include <stdio.h>
void f()
{
  printf("I am the TWO.\n");
}

Компиляция

gcc -c main.c -o main.o
gcc -c addon1.c -o addon1.o
gcc -c addon2.c -o addon2.o
gcc main.o addon1.o -o main1
gcc main.o addon2.o -o main2

Выбудет иметь программы ./main1 и ./main2, которые будут печатать ...ONE. и ...TWO..

0 голосов
/ 10 мая 2011

Вы не можете делать то, о чем вы говорите после факта, без некоторого жесткого времени с помощью шестнадцатеричного редактора.

Однако, если вы планируете заранее и встроите его в свое программное обеспечение, вы можете использовать динамическую загрузку длядобиться того же эффекта, как многие программы предоставляют функциональные возможности плагинов.Проверьте glib modules для общего способа сделать это в C.

0 голосов
/ 10 мая 2011

Создание исполняемого файла состоит из двух этапов.

  1. Для каждого указанного исходного файла (в вашем проекте / make-файле) ваш компилятор создаст объектный файл
  2. Для каждогоуказанный вами объектный файл (в вашем проекте / make-файле), ваш компоновщик свяжет их вместе и сделает ваш исполняемый файл

Один из способов перекомпиляции - просто пересобрать весь ваш проект.Вы получите более или менее тот же результат.

Но, похоже, вам нужно перекомпилировать только исходный файл addthis.c, а затем заново связать старую версию main.o (объектный файл скомпилирован для main.c) с новой версией addthis.o.Как это сделать, полностью зависит от используемого компилятора и системы сборки.

Кроме того, это решение будет работать, только если у вас есть main.o, addthis.c, и у вас точно такие же двоичные файлы компилятора / установки,и флаги компилятора, используемые для генерации main.o.Если это все на вашем ящике, то вы, вероятно, в порядке.

Если у вас есть только файлы addthis.c и main.exe, то нет никакого портативного способа сделать то, что вы хотите.

...