2013-03-30 192 views
2

我正在嘗試將C++函數(作爲字符串)發送到tcc編譯器(libtcc.dll)的方式來集成Visual C++ 2012和TCC。我已經添加了libtcc.h頭文件,但我不確定如何添加libtcc.dll,因爲沒有相應的.lib文件。我正在使用TCC發行版中的libtcc_test.c文件作爲我的Win32 main()函數。TCC與Visual Studio 2012

這裏是我的主:

#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以下錯誤:

是否有人有一個解決的辦法?

謝謝!

+0

tcc分佈很少更新。郵件列表上的大多數人會建議您從存儲庫中獲取最新的代碼並從那裏進行。見http://repo.or.cz/w/tinycc.git – mikijov

+0

我下載的是http://download.savannah.gnu.org/releases/tinycc/,它只有一個月(0.9.26) 。 –

回答

0

我認爲最簡單的方法是製作一個.lib文件,然後用它進行鏈接。請參閱http://msdn.microsoft.com/en-us/library/0b9xe492.aspx上的MSDN頁面,瞭解如何從.def文件創建.lib文件。在此之後,您可以使用指定.lib的常規方式進行鏈接。

+0

好吧,我用你的鏈接從libtcc.def建立lib文件,謝謝你。我得到的示例代碼下降到一個錯誤:「不能從'void *'轉換爲'int(__cdecl *)(int)」....我解決了這個搜索結果,並在這裏找到了同樣的問題:[link] (http://www.cplusplus.com/forum/general/17725/)。現在我運行它,它說它找不到libtcc.dll。我如何解決這個問題?對我來說,這只是一個簡單的Visual Studio鏈接問題。我想靜態綁定到我的應用程序的DLL。 –

+0

DLL未找到問題應該像在可執行文件所在的同一目錄中複製DLL一樣簡單。在進行調試時,請確保將工作目錄設置爲與可執行文件相同。這是必要的,因爲默認情況下VS會使您的項目文件夾成爲工作目錄。 – mikijov

+0

當前的TCC分發不提供libtcc作爲靜態庫。主要原因是因爲如果您鏈接到一個靜態庫,您將不得不手動解決所有庫依賴關係(您必須鏈接所有庫libtcc需求),如果它們提供了dll,這些全部解決。 – mikijov