带有 Visual Studio 2012 的 TCC
Posted
技术标签:
【中文标题】带有 Visual Studio 2012 的 TCC【英文标题】:TCC with Visual Studio 2012 【发布时间】:2013-03-30 18:50:13 【问题描述】:我正在尝试集成 Visual C++ 2012 和 TCC,以便将 C 函数(作为字符串)发送到 tcc 编译器 (libtcc.dll)。我已经添加了 libtcc.h 头文件,但我不确定如何添加 libtcc.dll,因为没有相应的 .lib 文件。我使用 TCC 发行版中的 libtcc_test.c 文件作为我的 Win32 main() 函数。
这是我的主要内容:
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include "stdafx.h"
#include "libtcc.h"
int add(int a, int b)
return a + b;
char my_program[] =
"int fib(int n)\n"
"\n"
" if (n <= 2)\n"
" return 1;\n"
" else\n"
" return fib(n-1) + fib(n-2);\n"
"\n"
"\n"
"int foo(int n)\n"
"\n"
" printf(\"Hello World!\\n\");\n"
" printf(\"fib(%d) = %d\\n\", n, fib(n));\n"
" printf(\"add(%d, %d) = %d\\n\", n, 2 * n, add(n, 2 * n));\n"
" return 0;\n"
"\n";
int main(int argc, char **argv)
TCCState *s;
int (*func)(int);
s = tcc_new();
if (!s)
fprintf(stderr, "Could not create tcc state\n");
exit(1);
/* if tcclib.h and libtcc1.a are not installed, where can we find them */
if (argc == 2 && !memcmp(argv[1], "lib_path=",9))
tcc_set_lib_path(s, argv[1]+9);
/* MUST BE CALLED before any compilation */
tcc_set_output_type(s, TCC_OUTPUT_MEMORY);
if (tcc_compile_string(s, my_program) == -1)
return 1;
/* as a test, we add a symbol that the compiled program can use.
You may also open a dll with tcc_add_dll() and use symbols from that */
tcc_add_symbol(s, "add", add);
/* relocate the code */
if (tcc_relocate(s, TCC_RELOCATE_AUTO) < 0)
return 1;
/* get entry symbol */
func = tcc_get_symbol(s, "foo");
if (!func)
return 1;
/* run the code */
func(32);
/* delete the state */
tcc_delete(s);
return 0;
当我尝试运行它时,我在 Visual Studio 2012 中收到以下错误:
error C3861: 'exit': identifier not found
error C3861: 'memcmp': identifier not found
error C2440: '=' : cannot convert from 'void *' to 'int (__cdecl *)(int)'
有没有人可以解决这个问题?
谢谢!
【问题讨论】:
tcc 发行版很少更新。邮件列表中的大多数人会建议您从存储库中获取最新代码并从那里开始。见repo.or.cz/w/tinycc.git 我下载的那个是download.savannah.gnu.org/releases/tinycc,才一个月大(0.9.26)。 【参考方案1】:我认为最简单的方法是制作一个 .lib 文件,然后将其用于链接。请参阅http://msdn.microsoft.com/en-us/library/0b9xe492.aspx 的 MSDN 页面,了解如何从 .def 文件创建 .lib 文件。在此之后,您可以使用常规方式指定要链接的 .lib。
【讨论】:
好的,我使用您的链接从 libtcc.def 构建 lib 文件,谢谢。我将示例代码归结为一个错误:“无法从 'void *' 转换为 'int (__cdecl *)(int)”......我通过谷歌搜索解决了这个问题,并在这里发现了同样的问题:link .现在我运行它,它说它找不到 libtcc.dll。我该如何解决?对我来说,这只是一个简单的 Visual Studio 链接问题。我想将 dll 静态绑定到我的应用程序中。 DLL not found 问题应该与将 DLL 复制到可执行文件所在的同一目录中一样简单。调试时,请确保将工作目录设置为与可执行文件所在的目录相同。这是必要的,因为默认情况下 VS 会将您的项目文件夹作为工作目录。 当前 TCC 发行版不提供 libtcc 作为静态库。主要原因是如果你链接到一个静态库,你将不得不手动解决所有库依赖项(你必须链接所有 libtcc 需要的库),如果它们提供了一个 dll,这一切都会为你解决。以上是关于带有 Visual Studio 2012 的 TCC的主要内容,如果未能解决你的问题,请参考以下文章
带有 Visual Studio 2012 Express 的 Directx 9
带有 char16_t 或 char32_t 的 Visual Studio C++ 2015 std::codecvt
C++ Visual Studio 2012 错误 C3861:'_T':找不到标识符?