2015-04-27 4 views
1

у меня есть следующие коды:Использование "Экстерн" в команду для совместного использования с переменной

(1) extern_test.h:

extern int give_something; 

(2) extern_test.c:

#include <stdio.h> 
#include "extern_test.h" 
int give_something = 10; 

(3) extern_test2.c:

#include <stdio.h> 
#include "extern_test.h" 

int main() 
{ 
    printf("%i\n", give_something); 
    return 0; 
} 

Теперь, когда Я компилирую extern_test2.c на терминале, он говорит, что «неопределенная ссылка на" give_something».... Пожалуйста, помогите, почему это не работает ..

+0

показать нам свою команду makefile/command line. – John3136

+1

Вы связываете его с extern_test.c? Без этого компоновщик не будет знать, где указано значение__события. Что касается extern_test.c, то он не существует. Поэтому give_something никогда не определяется. –

+0

Это то, что я получаю: ~ $ НКИ extern_test2 -o extern_test2 ----> дает -----> /tmp/ccydzDba.o: В функции 'главный: extern_test2.c: (.text + 0x6): неопределенная ссылка на 'give_something ' collect2: error: ld возвращен 1 статус выхода –

ответ

0

«неопределенная ссылка»означает, что код написано штраф , но как только все разные файлы скомпилированы, и пришло время связать их вместе, один из файлов не имеет того, что вы ищете (в данном случае give_something). Это называется ошибкой компоновщика.

Проблема, скорее всего, в том, что вы не используете правильную командную строку для компилятора - вы пытаетесь скомпилировать extern_test.c и extern_test2.c в два отдельных двоичных файла. Таким образом, когда вы компилируете extern_test.c, он отлично работает, но когда вы пытаетесь скомпилировать extern_test2.c, он не может найти переменную, потому что она была объявлена ​​в extern_test.c.

Предполагая, что вы используете г ++, используйте эту команду:

g++ extern_test.c extern_test2.c 

Обратите внимание, как они оба скомпилированные вместе. Есть команды fancier, которые позволяют вам скомпилировать каждый отдельно в объектный файл , затем link все вместе после этого с третьей командой, но это необязательно здесь.

+0

Большое спасибо. Я не знал о ссылке. Поскольку я использую gcc: gcc extern_test.c extern_test2.c -o extern_program и затем ./exterm_program. Это сработало. Спасибо большое! –

+0

Хотя 'g ++' будет компилировать это, 'gcc' следует использовать; в противном случае файлы обрабатываются как 'C++'. –