2015-06-08 3 views
1

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

arch/arm/mach-msm/jtag-mm.o: In function `dbg_init_arch_data': 
/home/sansari/WORKING_DIRECTORY/arch/arm/mach-msm/jtag-mm.c:279: multiple definition of `msm_jtag_save_cntr' 
arch/arm/mach-msm/jtag.o:/home/sansari/WORKING_DIRECTORY/arch/arm/mach-msm/jtag.c:1085: first defined here 
arch/arm/mach-msm/jtag-mm.o: In function `etm_init_arch_data': 
/home/sansari/WORKING_DIRECTORY/arch/arm/mach-msm/jtag-mm.c:568: multiple definition of `msm_jtag_save_state' 
arch/arm/mach-msm/jtag.o:/home/sansari/WORKING_DIRECTORY/arch/arm/mach-msm/jtag.c:1038: first defined here 
arch/arm/mach-msm/jtag-mm.o: In function `msm_jtag_restore_state': 
/home/sansari/WORKING_DIRECTORY/arch/arm/mach-msm/jtag-mm.c:585: multiple definition of `msm_jtag_restore_state' 
arch/arm/mach-msm/jtag.o:/home/sansari/WORKING_DIRECTORY/arch/arm/mach-msm/jtag.c:1073: first defined here 
arch/arm/mach-msm/jtag-mm.o: In function `dbg_init_arch_data': 
/home/sansari/WORKING_DIRECTORY/arch/arm/mach-msm/jtag-mm.c:279: multiple definition of `msm_jtag_restore_cntr' 
arch/arm/mach-msm/jtag.o:/home/sansari/WORKING_DIRECTORY/arch/arm/mach-msm/jtag.c:1085: first defined here 
make[1]: *** [arch/arm/mach-msm/built-in.o] Error 1 

Я положил копию JTAG-mm.c на this link

Спасибо. Вот jtag.c

После закомментировав jtag.h и перекомпиляции я получаю следующее сообщение об ошибке:

arch/arm/mach-msm/jtag-mm.c:790:2: error: implicit declaration of function 'msm_jtag_fuse_apps_access_disabled' [-Werror=implicit-function-declaration] 
cc1: some warnings being treated as errors 
make[1]: *** [arch/arm/mach-msm/jtag-mm.o] Error 1 
make: *** [arch/arm/mach-msm] Error 2 

@Peter - Спасибо. Я понимаю, что вы говорите. ОК. позвольте мне попробовать. Не обращайте внимания на комментарий grep :-) Я вижу, что это невозможно.

Обновление: Спасибо. Теперь я вижу, в чем проблема. Теперь, когда я разместил jtag.h и jtag-mm.c и jtag.c, вы можете проверить, что я думаю об этом. Как отметил Петр, переменные объявляются дважды. Один раз на jtag.c и снова на jtag-mm.c. Например, я вижу строки:

uint32_t msm_jtag_save_cntr[NR_CPUS]; 
uint32_t msm_jtag_restore_cntr[NR_CPUS]; 

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

Here является копией jtag.h Благодаря

+0

мы также должны увидеть содержимое jtag.c. Однако кажется, что оба файла .c содержат 4 функции, которые имеют одинаковое имя в обоих файлах. – user3629249

+0

1) большинство/все функции объявлены «статическими», затем некоторые из имен функций экспортируются с помощью «EXPORT_SYMBOL». В общем, неплохо было бы сделать «статические» функции глобально видимыми. 2) многие из функций имеют модификатор «inline», однако функции очень большие. Поэтому компилятор не будет «встроить» их. и тривиальная экономия от удаления последовательностей вызова/возврата будет захламлена, если эти функции будут вызваны из более одного места. 3) встроенные функции должны быть в заголовочных файлах, поэтому несколько источников могут встраивать в них – user3629249

+0

, а функции inline'd (я не проверял их все) вызывается только один раз, а функции большие.так что: 1) функции не будут «inline'd 2» inline применимы только для ОЧЕНЬ коротких функций, которые называются многократно – user3629249

ответ

0

Вы не показали файл jtag.h, так что можно только гадать о том, что он делает.

Поскольку большинство ошибок исчезают при «комментировании jtag.h», наиболее вероятным объяснением является то, что заголовочный файл имеет определения, а один из исходных файлов - #include, содержащий заголовочный файл более одного раза (напрямую или - скорее - косвенно, из-за других файлов заголовков #include). Обычное решением, что является добавление включает охрану в файл заголовок формы

#ifndef SOME_MACRO_CHOSEN_TO_BE_UNIQUE_TO_THE_HEADER 
#define SOME_MACRO_CHOSEN_TO_BE_UNIQUE_TO_THE_HEADER 

    /* the content of the header file 

#endif 

Вы можете также (после закрепления выше, так что компилятор прекращает удушье от вашего кода) получают ошибки компоновщика. Это будет результатом нескольких исходных файлов #include, входящих в ваш заголовок, и, следовательно, ссылки, которые видят символы, определенные в нескольких объектных файлах. Решением этого будет перемещение оскорбительных определений (как правило, из любых функций или статических переменных) из файла заголовка в ОДИН (и только ОДИН) исходных файлов в вашем проекте.

+0

Я попытался удалить заявление о нарушении из одного из исходных файлов. Но я получаю ошибку: msm_jtag_save_cntr 'uneclared. Как мне это решить? Могу ли я поместить объявление в файл заголовка? – user3326293

+0

Если вы хотите, чтобы переменная была разделена между исходным файлом, тогда объявите ее 'extern' в заголовке (т.е.' extern uint32_t msm_jtag_save_cntr [NR_CPUS]; '), затем определите ее в ONE и только ОДИН из источника файлов (т.е. 'uint32_t msm_jtag_save_cntr [NR_CPUS];'). Имейте в виду, что изменения, внесенные в эту переменную/массив в любом исходном файле, будут видны для кода в другом исходном файле. Это всего лишь стоп-лосс, но ваша реальная проблема заключается в дублировании кода между исходными файлами, не понимая последствий (несколько способов справиться с этим). – Peter

+0

Спасибо. На данный момент я просто функциональный. Я считаю, что проблема дублирования кода среди исходных файлов имеет последствия для безопасности? Я сейчас не занимаюсь этим, так как это будет образ прототипа. – user3326293

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