C 链接错误(使用 tcc)
C linking error (with 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'
一个库中的link,需要在所有c
个文件或o
个文件后添加一个-l${library_basename}
标志。
如果库名为 libtcc.a
或 libtcc.so
(在 Windows 上可能是 tcc.dll
或 libtcc.dll
),则需要添加 -ltcc
.
tcc ./examples/libtcc_test.c -ltcc
您可能还需要添加一个 -L
标志来添加搜索路径,以防您要 link 进入的库不是您系统的标准库目录:
tcc -L . ./examples/libtcc_test.c -ltcc
#also look for libtcc.so or libtcc.a in the current directory (.)
tinycc 仓库中 test/libtcc_test.c
的 libtcc_test.c
还需要 dl
库(用于动态加载的标准库)来构建:
tcc -L . tests/libtcc_test.c -ltcc -ldl #worked
(它抱怨未定义的 dlopen
、dlclose
和 dlsym
,这些已知来自 libdl
)。
以下命令适用于 Windows:
cd your-tcc-directory
tcc -Ilibtcc -L. -ltcc examples/libtcc_test.c
您可能需要添加 -run
以跳过生成 exe 文件和直接 运行 源代码。
我在 Linux 上试过了,但找不到 libtcc.h
。我想以下会起作用(注意 -ltcc1
而不是 -ltcc
):
tcc -I/path/to/libtcc.h/location -L/usr/lib/tcc/x86-64 -ltcc1 path/to/libtcc_test.c
我正在尝试 运行 来自 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'
一个库中的link,需要在所有c
个文件或o
个文件后添加一个-l${library_basename}
标志。
如果库名为 libtcc.a
或 libtcc.so
(在 Windows 上可能是 tcc.dll
或 libtcc.dll
),则需要添加 -ltcc
.
tcc ./examples/libtcc_test.c -ltcc
您可能还需要添加一个 -L
标志来添加搜索路径,以防您要 link 进入的库不是您系统的标准库目录:
tcc -L . ./examples/libtcc_test.c -ltcc
#also look for libtcc.so or libtcc.a in the current directory (.)
tinycc 仓库中 test/libtcc_test.c
的 libtcc_test.c
还需要 dl
库(用于动态加载的标准库)来构建:
tcc -L . tests/libtcc_test.c -ltcc -ldl #worked
(它抱怨未定义的 dlopen
、dlclose
和 dlsym
,这些已知来自 libdl
)。
以下命令适用于 Windows:
cd your-tcc-directory
tcc -Ilibtcc -L. -ltcc examples/libtcc_test.c
您可能需要添加 -run
以跳过生成 exe 文件和直接 运行 源代码。
我在 Linux 上试过了,但找不到 libtcc.h
。我想以下会起作用(注意 -ltcc1
而不是 -ltcc
):
tcc -I/path/to/libtcc.h/location -L/usr/lib/tcc/x86-64 -ltcc1 path/to/libtcc_test.c