2015-04-23 3 views
0

Я использую плагин Eclipse + ARM для создания моих проектов. Когда мне нужно было использовать в своей библиотеке StemWin проекта, я настроил свою среду IDE на использование внешней библиотеки. I set Preferences-> C/C++ General-> Pahs and Symbols Я добавляю ссылку «Пути библиотек» к моей папке, включая библиотеку. Во-вторых, я добавляю имя моей библиотеки на вкладке «Библиотека» Я проверил настройки на вкладке компилятора, и я установил, что все должно быть хорошо. Когда я пытался создать свой проект, я получаю ошибку от компоновщика.STM32 Eclipse + ARM GNU toolchain error linker.

не может найти -lMyLib.a Здравствуйте C/C++ Проблема

Я проверил имя моей библиотеки и ссылки, все правильно. Это результат моего компоновщика:

arm-none-eabi-gcc -mcpu = cortex-m4 -mthumb -mfloat-abi = hard -L "C: \ lib" -T "C: \ arm_toolchain \ stm32_workspace \ Hello \ LinkerScript.ld "-Wl, -Map = output.map -Wl, -gc-sections -o" Hello.elf "@" objects.list "-lMyLib.a

Возможно, у кого-то такая же проблема , Лучшие регаты.

ответ

1

я столкнулся с той же проблемой, прежде чем ...
-l: STemWin526_CM4_GCC.a
-L "C: \ Edu_Workspace \ STM32F4 \ stm32f4_bsp_template \ Drivers \ промежуточное программное \ ST \ STemWin \ Lib"
Выше мой рабочих параметров. с -l: двоеточие ':' важно для связывания архивного файла
И -L будет содержать путь к библиотеке. Также для stemwin обязательно скомпилируйте с аппаратной плавающей точкой -mfloat-abi = hard -mfpu = fpv4-sp-d16

0

Похож, проблема в -lMyLib.a, что означает, что вы пытаетесь связать статическую библиотеку как динамическую.

Чтобы связать статическую LIB, вы должны использовать свой путь, как с обычными .o файлами: ... /path/to/MyLib.a

и в результате командной строки должен выглядеть примерно так

arm-none-eabi-gcc -mcpu=cortex-m4 -mthumb -mfloat-abi=hard -L"C:\lib" -T"C:\arm_toolchain\stm32_workspace\Hello\LinkerScript.ld" -Wl,-Map=output.map -Wl,--gc-sections -o "Hello.elf" @"objects.list" /path/to/MyLib.a 

UPDATE:

Хотя это может решить проблему, выясняется, что это неверно:

-llibrary

-l библиотека

... Обычно файлы найдены таким образом библиотечные файлы-архивные файлы, члены которых объектные файлы. Компилятор обрабатывает файл архива, просматривая его для членов, которые определяют символы, которые до сих пор ссылались, но не определялись. Но если найденный файл является обычным объектным файлом, он связан обычным образом. Единственная разница между использованием опции -l и указанием имени файла заключается в том, что -l окружает библиотеку с «lib» и «.a» и ищет несколько каталогов.

(https://gcc.gnu.org/onlinedocs/gcc/Link-Options.html)

+0

Это не имеет ничего общего с «статическими» или «динамическими» библиотеками. Соглашения с '-l' одинаковы для обоих. – mfro

+0

круто, всегда приятно узнать что-то новое – dekkard

1

конвенции для -l варианта линкера (скажем, вы даете -lMyLib.a в качестве опции линкера) будет искать файл библиотеки с «lib» предваряется к имени и .a (или .so), то есть ваша командная строка ищет файл libMyLib.a.{a,so}, который, вероятно, не так называется.

Либо вы переименуете свою библиотеку в соответствии с этим соглашением, либо передадите ее в командную строку компоновщика, опуская -l (если ваша IDE позволяет это сделать).

+0

Спасибо за ваш ответ. Проблема решена. – MarCovy

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