Ошибка компоновщика Renesas GCC с общим кодом - PullRequest
0 голосов
/ 26 июня 2018

Я использую 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
  • Убедитесь, что выбран «Создать папку верхнего уровня»
  • Нажмите «Дополнительно»
  • Установите флажки для «Создать ссылки в рабочей области» и «Создать виртуальные папки» и «Создать расположение ссылок относительно:» is PROJECT_LOC
  • Конец

Затем я добавляю пути включения библиотек в настройки сборки ...

  • Щелчок правой кнопкой мыши по названию проекта на панели E2 "Project Explorer"
  • Выберите «Свойства»
  • Выбрать 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 Ответ

0 голосов
/ 26 июня 2018

В конце концов я заметил, что журнал сборки не содержит файлов 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 не был скомпилирован, не было объектного файла для ссылки, следовательно, ошибка компоновщика.

...