Ошибка связывания C (с tcc)

Я пытаюсь запустить пример из tiny cc (tcc- 0.9.26-win64-bin.zip) с именем libtcc_test.c.

Я скопировал libtcc.h из libtcc в include и libtcc.def в lib.
Затем я запустил tcc ./examples/libtcc_test.c и получил ошибку связывания :/

tcc: error: undefined symbol 'tcc_new'
tcc: error: undefined symbol 'tcc_set_lib_path'
tcc: error: undefined symbol 'tcc_set_output_type'
tcc: error: undefined symbol 'tcc_compile_string'
tcc: error: undefined symbol 'tcc_add_symbol'
tcc: error: undefined symbol 'tcc_relocate'
tcc: error: undefined symbol 'tcc_get_symbol'
tcc: error: undefined symbol 'tcc_delete'

Что мне не хватает?


Дополнительная информация:

P:\cpp\tcc>tcc ./examples/libtcc_test.c -vv
tcc version 0.9.26 (i386 Win32)
-> ./examples/libtcc_test.c
-> p:/cpp/tcc/include/stdlib.h
->  p:/cpp/tcc/include/_mingw.h
->   p:/cpp/tcc/include/stddef.h
->   p:/cpp/tcc/include/stdarg.h
->  p:/cpp/tcc/include/limits.h
->  p:/cpp/tcc/include/sec_api/stdlib_s.h
->   p:/cpp/tcc/include/stdlib.h
->  p:/cpp/tcc/include/malloc.h
-> p:/cpp/tcc/include/stdio.h
->  p:/cpp/tcc/include/vadefs.h
->  p:/cpp/tcc/include/sec_api/stdio_s.h
->   p:/cpp/tcc/include/stdio.h
-> p:/cpp/tcc/include/string.h
->  p:/cpp/tcc/include/sec_api/string_s.h
->   p:/cpp/tcc/include/string.h
-> p:/cpp/tcc/include/libtcc.h
-> p:/cpp/tcc/lib/libtcc1.a
-> p:/cpp/tcc/lib/msvcrt.def
-> p:/cpp/tcc/lib/kernel32.def
tcc: error: undefined symbol 'tcc_new'
tcc: error: undefined symbol 'tcc_set_lib_path'
tcc: error: undefined symbol 'tcc_set_output_type'
tcc: error: undefined symbol 'tcc_compile_string'
tcc: error: undefined symbol 'tcc_add_symbol'
tcc: error: undefined symbol 'tcc_relocate'
tcc: error: undefined symbol 'tcc_get_symbol'
tcc: error: undefined symbol 'tcc_delete'

person Maciej Kozieja    schedule 01.04.2017    source источник
comment
Ну, вам нужно связать библиотеки и включить файлы, чтобы скомпилировать ваш код. Убедитесь, что вы связываете и включаете необходимые библиотеки и заголовки.   -  person danglingpointer    schedule 01.04.2017
comment
Я очень новичок в c, но есть #include libtcc.h и tcc ... -vv также вывод говорит, что он добавлен, но я не знаю, как загрузить файл .def   -  person Maciej Kozieja    schedule 01.04.2017
comment
@LethalProgrammer: ... нужно связать с... включаемыми файлами... включаемые (заголовочные) файлы не используются на этапе связывания, а только во время компиляции, которая выполняется, когда доходит до связывания.   -  person alk    schedule 01.04.2017


Ответы (2)


Чтобы создать ссылку в библиотеке, вам нужно добавить флаг -l${library_basename} после всех c файлов или o файлов. Если библиотека называется libtcc.a или libtcc.so (в Windows это, вероятно, tcc.dll или libtcc.dll), вам нужно добавить -ltcc.

tcc  ./examples/libtcc_test.c  -ltcc

Вам также может понадобиться добавить флаг -L, чтобы добавить путь поиска в случае, если библиотека, которую вы хотите связать, не является каталогом стандартных библиотек вашей системы:

tcc -L . ./examples/libtcc_test.c -ltcc
#also look for libtcc.so or libtcc.a in the current directory (.)

libtcc_test.c из test/libtcc_test.c в репозитории tinycc также нуждалась в библиотеке dl (стандартная библиотека для динамической загрузки) для сборки:

tcc -L .  tests/libtcc_test.c  -ltcc -ldl #worked 

(он жаловался на неопределенные dlopen, dlclose и dlsym, которые, как известно, происходят от libdl).

person PSkocik    schedule 01.04.2017

Следующая команда работала в Windows:

cd your-tcc-directory
tcc -Ilibtcc -L. -ltcc examples/libtcc_test.c

Возможно, вы захотите добавить -run, чтобы пропустить создание исполняемого файла и прямой запуск исходного кода.

Я попробовал это в Linux, но не смог найти libtcc.h. Я предполагаю, что следующее будет работать (обратите внимание на -ltcc1 вместо -ltcc):

tcc -I/path/to/libtcc.h/location -L/usr/lib/tcc/x86-64 -ltcc1 path/to/libtcc_test.c
person André Willik Valenti    schedule 05.07.2017