I'm trying to run the example from tiny cc (tcc-0.9.26-win64-bin.zip) called libtcc_test.c
.
I've copied libtcc.h
from libtcc
into include
and libtcc.def
into lib
.
Then I ran tcc ./examples/libtcc_test.c
and got a linking error :/
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'
What am I missing ?
More info:
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'
To link in a library, you need to add a -l${library_basename}
flag after all c
files or o
files.
If the library is named libtcc.a
or libtcc.so
(on Windows it's probably tcc.dll
or libtcc.dll
), you need to add -ltcc
.
tcc ./examples/libtcc_test.c -ltcc
You might also need to add an -L
flag to add a search path in case the library you want to link in is not your system's standard library directories:
tcc -L . ./examples/libtcc_test.c -ltcc
#also look for libtcc.so or libtcc.a in the current directory (.)
The libtcc_test.c
from test/libtcc_test.c
in the tinycc repo also needed the dl
library (standard library for dynamic loading) to build:
tcc -L . tests/libtcc_test.c -ltcc -ldl #worked
(it complained about undefined dlopen
, dlclose
, and dlsym
which are known to come from libdl
).