Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Вопрос по Tiny C Compiler

32K
06 октября 2009 года
Sharrp
13 / / 25.02.2008
Здравствуйте, помогите, пожалуйста, разобраться в следующей ситауции. Все дело происходит в VS2008 (VC++). Постараюсь покороче.

Дано:

файл CCode.txt с сишным кодом:
 
Код:
int vxi_func(int x)
{
    return 5 * sum(x);
}

int sum(int x)
{
    return x + 3;
}


часть кода win-forms программы:
Код:
#include "libtcc.h"
...
TCCState *tccState;
unsigned long val = 0;

try
{
    TCCState* tccState = tcc_new();

    //необходимо для работы libtcc
    tcc_set_output_type( tccState, TCC_OUTPUT_MEMORY );

    tcc_add_library_path( tccState, ".\\lib" );

    //Считываю код из файла
    StreamReader^ _codeReader = gcnew StreamReader( "CCode.txt" );
    String^ str = _codeReader->ReadToEnd();
    std::string func = "";

    //преобразует System::String^ в std::string
    MarshalString( str, func );

    //Собственно компиляция
    tcc_compile_string( tccState, func.c_str() );

    /* copy code into memory passed in by the caller and do all relocations
       (needed before using tcc_get_symbol()).
       returns -1 on error and required size if ptr is NULL */
    tcc_relocate( tccState );

    //получение адреса функции vxi_func
    tcc_get_symbol( tccState, &val, "vxi_func" );

    //Указатель на функцию
    int ( *vxi_func )(int);

    vxi_func = (int (__cdecl*)(int))val;

    if( vxi_func != NULL )
    {  
        int d = vxi_func(1);
        MessageBox::Show( "Result: " + d.ToString() );
    }
    else
    {
        MessageBox::Show( "Error" );
    }

    tcc_delete(tccState);
}
catch (Exception^ e)
{          
    MessageBox::Show( e->Message );
}


Этот код работает (для компактности я убрал проверки на ошибки). Мне необходимо, чтобы в файле CCode.txt использовались функции из сторонних библиотек. Но при попытке добавить туда директиву #include или using namespace... tcc_compile_string выдает -1 и на этом конец. Кто-нибудь знаком близко с TCC?
5
06 октября 2009 года
hardcase
4.5K / / 09.08.2005
Цитата: Sharrp
Мне необходимо, чтобы в файле CCode.txt использовались функции из сторонних библиотек. Но при попытке добавить туда директиву #include или using namespace... tcc_compile_string выдает -1 и на этом конец. Кто-нибудь знаком близко с TCC?


А с каких пор пространства имен появились в языке C?
Cобственно об #include сказать ничего не могу. Логически - это директива препроцессора, возможно он просто не поддерживает их.

Кстати, раз уж вы работаете из .NET, то почему бы не воспользоваться стандартными для .NET средствами: компилятор C#, VB.NET, JScript.NET. Все они идут в базовой поставке фреймворка.

32K
06 октября 2009 года
Sharrp
13 / / 25.02.2008
hardcase, не очень вас понял на счет использования .Net компиляторов... Файлы то сишные.
TCC быстрее, к тому же для меня важна именно библиотека libtcc.dll, которая и содержит функции, позволяющие на лету компилировать С-код.

p.s. За using каюсь... спасибо
5
06 октября 2009 года
hardcase
4.5K / / 09.08.2005
Цитата: Sharrp
hardcase, не очень вас понял на счет использования .Net компиляторов...

В .NET есть API для вызова указанных компиляторов, они умеют собирать в рантайме динамические сборки, существующие только в течении времени жизни домена приложения. Естественно, проблема взаимодействия со сторонним кодом становится прозрачной настолько, насколько это позволяет .NET.


Цитата: Sharrp
Файлы то сишные.


Ага. Т.е. какоето (видимо достаточно большое) колчиество кода на Tiny C уже есть?


Цитата: Sharrp
TCC быстрее

Хмм, вашей задачи не знаю, поэтому судить о производительности не берусь.

32K
07 октября 2009 года
Sharrp
13 / / 25.02.2008
Цитата: hardcase
Ага. Т.е. какоето (видимо достаточно большое) колчиество кода на Tiny C уже есть?


Совершенно верно. Вполне достаточный объем, чтобы отказаться от его переписывания (13000 строк).

Я бы не хотел ходить вокруг да около. Если возможно, то подскажите, пожалуйста, что необходимо сделать, чтобы компилировался код с использованием сторонних функций.

32K
09 октября 2009 года
Sharrp
13 / / 25.02.2008
добавил tcc_add_include_path (tccState, "C:\\tcc\\include")
Покидал по указанному пути необходимые *.h файлы. Ругаться на #include перестал. Но теперь выдает ошибку после tcc_relocate, если использовать, скажем, sin() из math.h
307
09 октября 2009 года
Artem_3A
863 / / 11.04.2008
Цитата: Sharrp
добавил tcc_add_include_path (tccState, "C:\\tcc\\include")
Покидал по указанному пути необходимые *.h файлы. Ругаться на #include перестал. Но теперь выдает ошибку после tcc_relocate, если использовать, скажем, sin() из math.h



уважаемый, бросьте это безнадежное дело! если используете эти глупые винформы на с++ то скомпильте свой сишный код в длл и дружите его с дотнет, или же откажитесь от них! а вообще хотите писать на дотнет пишите на шарпе, хотите на с++ берите для гуи кьют!

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог