При компиляции примера linux/spiflash_read_id.c из репозитория [1] столкнулся с ошибкой подключения библиотеки lftdi в среде SCons. Простая строка компилятора GCC отрабатывала нормально без scons:
$ gcc spiflash_read_id.c -o spiflash_read_id -lftdi
Однако при добавлении опции компилятора -lftdi к опциям GCC в скрипт SConstruct возникала ошибка. Скрипт SConstruct:
env = Environment()
env.Append(CCFLAGS='-lftdi')
env.Program('spiflash_read_id.c')
Ошибка компиляции:
$ scons
scons: Reading SConscript files ...
scons: done reading SConscript files.
scons: Building targets ...
gcc -o spiflash_read_id.o -c -lftdi spiflash_read_id.c
gcc -o spiflash_read_id spiflash_read_id.o
/bin/ld: spiflash_read_id.o: in function `main':
spiflash_read_id.c:(.text+0x23): undefined reference to `ftdi_new'
/bin/ld: spiflash_read_id.c:(.text+0x79): undefined reference to `ftdi_usb_open'
/bin/ld: spiflash_read_id.c:(.text+0x91): undefined reference to `ftdi_get_error_string'
/bin/ld: spiflash_read_id.c:(.text+0xc8): undefined reference to `ftdi_usb_reset'
/bin/ld: spiflash_read_id.c:(.text+0xdc): undefined reference to `ftdi_set_interface'
/bin/ld: spiflash_read_id.c:(.text+0xf5): undefined reference to `ftdi_set_bitmode'
/bin/ld: spiflash_read_id.c:(.text+0x10e): undefined reference to `ftdi_set_bitmode'
/bin/ld: spiflash_read_id.c:(.text+0x11d): undefined reference to `ftdi_usb_purge_buffers'
/bin/ld: spiflash_read_id.c:(.text+0x17b): undefined reference to `ftdi_usb_reset'
/bin/ld: spiflash_read_id.c:(.text+0x18a): undefined reference to `ftdi_usb_close'
/bin/ld: spiflash_read_id.o: in function `spi_init':
spiflash_read_id.c:(.text+0x3f0): undefined reference to `ftdi_write_data'
/bin/ld: spiflash_read_id.o: in function `spi_rw_buffer':
spiflash_read_id.c:(.text+0x71d): undefined reference to `ftdi_usb_purge_tx_buffer'
/bin/ld: spiflash_read_id.c:(.text+0x73c): undefined reference to `ftdi_write_data'
/bin/ld: spiflash_read_id.c:(.text+0x8c3): undefined reference to `ftdi_read_data'
collect2: error: ld returned 1 exit status
scons: *** [spiflash_read_id] Error 1
scons: building terminated because of errors.
Как видно из результата компиляции, опция -lftdi нормально передается в командную строку компилятора, но порядок следования опций другой, в результате чего линкер выдает ошибку.
Решить проблему можно с помощью создания переменной окружения LIBS в скрипте SConstruct следующим образом:
env = Environment()
env.Append(LIBS=['ftdi'])
env.Program('spiflash_read_id.c')
Или так:
Program('spiflash_read_id.c', LIBS=['ftdi'])
После этого компиляция завершается нормально:
$ scons
scons: Reading SConscript files ...
scons: done reading SConscript files.
scons: Building targets ...
gcc -o spiflash_read_id.o -c spiflash_read_id.c
gcc -o spiflash_read_id spiflash_read_id.o -lftdi
scons: done building targets.
Дополнительную информацию по подключению библиотек к компиляции scons и путей поиска библиотек см. раздел "Сборка с подключением библиотек" статьи [2].
[Ссылки]
1. har-in-air / FT2232H_CODE_EXAMPLES site:github.com. 2. SCons: погружаемся глубже. |