2

I am trying to integrate Visual C++ 2012 and TCC in such as way as to send in a C function (as a string) into the tcc compiler (libtcc.dll). I have added the libtcc.h header file, though I am unsure how to add the libtcc.dll since there is no corresponding .lib file. I am using the libtcc_test.c file in the TCC distribution as my Win32 main() function.

Here is my 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;
}

When I attempt to run it, I get the following errors in 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)'

Does anybody have a solution to this?

Thanks!

Guilherme Fidelis
  • 1,022
  • 11
  • 20
  • tcc distributions are rarely updated. Most people on the mailing list would recommend that you get the latest code from the repository and go from there. See http://repo.or.cz/w/tinycc.git – mikijov Mar 30 '13 at 19:40
  • The one I downloaded is from http://download.savannah.gnu.org/releases/tinycc/ and it's only a month old (0.9.26). – Bill Tricarico Mar 30 '13 at 21:03

1 Answers1

0

The easiest way I think is to make a .lib file, and then use it for linking. Please see MSDN page at http://msdn.microsoft.com/en-us/library/0b9xe492.aspx on how to create a .lib file from a .def file. After this, you can use normal way of specifying a .lib to link against.

mikijov
  • 1,552
  • 24
  • 37
  • Ok I used your link to build the lib file from libtcc.def, thanks for that. I got the sample code down to one error: the "cannot convert from 'void *' to 'int (__cdecl *)(int)"....and I resolved this by googling and found the same issue here: [link](http://www.cplusplus.com/forum/general/17725/). Now I run it and it says that it can't find libtcc.dll. How do I resolve that? To me, that's just a simple Visual Studio linking issue. I'd like to statically bind the dll into my app. – Bill Tricarico Mar 31 '13 at 07:03
  • DLL not found issue should be as easy as copying the DLL in the same directory where your executable is. When you are debugging, make sure you set your working directory to be the same where the executable is. This is necessary because VS by default makes your project folder to be the working directory. – mikijov Mar 31 '13 at 13:26
  • Current TCC distribution does not provide libtcc as a static library. The primary reason is because if you link against a static library you will have to resolve all the library dependencies manually (you have to link with all libraries libtcc needs), where this is all resolved for you if they provide a dll. – mikijov Mar 31 '13 at 13:29