Ошибка компоновщика Renesas GCC с общим кодом
Я использую GCC для Renesas с IDE Renesas E2 Studio (v.6.2.0). Не то чтобы это имело значение, но я также использовал Applilet3 (v.3.08.01.05) для генерации файлов поддержки платы и драйверов периферийных устройств.
Когда я пытаюсь собрать, я получаю следующие ошибки...
'Invoking Linker'
rl78-elf-gcc (......object files and flags.......)
./src/r_main.o: In function `main':
<path_to_git_repo_dir>\src\<project_name>\HardwareDebug/../src/r_main.c:86: undefined reference to `_common_lib_a_init'
<path_to_git_repo_dir>\src\<project_name>\HardwareDebug/../src/r_main.c:89: undefined reference to `_common_lib_b_init'
collect2.exe: error: ld returned 1 exit status
makefile:67: recipe for target 'my_project.elf' failed
make: *** [my_project.elf] Error 1
Настройка проекта
У меня есть некоторый исходный код, разделяемый между проектами в папке "lib". В main()
Я вызываю некоторые функции инициализации для этих "библиотек", как вы можете видеть из ошибок. Я не понимаю, почему процесс компиляции работает, и все же это не удается.
Мой исходный текст дерева выглядит так...
git-repo-dir/
.git/
doc/
lib/
my_lib_a/
common_lib_a.h
common_lib_a.c
my_lib_b/
common_lib_b.h
common_lib_b.c
src/
my_project/
.cproj
.project
applilet3_config.cgp
src/
generate/
Я добавил исходный код библиотеки в свой проект E2 Studio с помощью...
- Щелкните правой кнопкой мыши имя проекта на панели "Project Explorer" в E2.
- Нажатие кнопки
Import
и выберитеFile System
- Перейти к
get-repo-dir
и выберите (в один клик)lib
папка - Установите флажок на левой панели, чтобы включить все файлы в
lib
- Убедитесь, что выбран "Создать папку верхнего уровня"
- Нажмите "Дополнительно"
- Установите флажки "Создать ссылки в рабочей области" и "Создать виртуальные папки" и "Создать расположения ссылок относительно:".
PROJECT_LOC
- Конец
Затем я добавляю пути включения для библиотек в настройки сборки...
- Щелкните правой кнопкой мыши имя проекта на панели "Project Explorer" в E2.
- Выберите "Свойства"
- Выбрать
C/C++ General > Paths and Symbols
- Убедитесь, что конфигурация является текущей / активной
- Выберите язык "GNU C"
- Нажмите "Добавить", чтобы добавить следующее
"${ProjDirPath}/../../lib/my_lib_a"
"${ProjDirPath}/../../lib/my_lib_b"
- Применять
- Убедитесь, что эти пути видны в
C/C++ Build > Settings > Compiler > Includes
Так в E2 Studio, Project Explorer показывает..
Archives/ (a virtual folder)
Includes/ (a virtual folder/list)
src/
generate/
lib/ (the virtual lib folder I added)
my_lib_a/
my_lib_b/
Есть идеи, почему я получаю ошибку компоновщика?
1 ответ
В конце концов я заметил, что журнал сборки не содержит никаких файлов C из lib/
папка.
Решение было простым. В E2 Studio на панели Project Explorer я перетащил lib/
папка в (сверху) src/
папка.
Теперь структура в Project Explorer выглядит следующим образом:
Archives/ (a virtual folder)
Includes/ (a virtual folder/list)
src/
lib/ (the virtual lib folder I added)
my_lib_a/
my_lib_b/
generate/
Очевидно, E2 Studio не помещает исходный код, который находится за пределами src/
каталог в автоматически сгенерированном файле make. Или, может быть, есть некоторые настройки, которые я пропустил. Тем не менее, так как код C не был скомпилирован, не было объектного файла для ссылки, следовательно, ошибка компоновщика.