Вопрос по Tiny C Compiler
Дано:
файл CCode.txt с сишным кодом:
{
return 5 * sum(x);
}
int sum(int x)
{
return x + 3;
}
часть кода win-forms программы:
...
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?
А с каких пор пространства имен появились в языке C?
Cобственно об #include сказать ничего не могу. Логически - это директива препроцессора, возможно он просто не поддерживает их.
Кстати, раз уж вы работаете из .NET, то почему бы не воспользоваться стандартными для .NET средствами: компилятор C#, VB.NET, JScript.NET. Все они идут в базовой поставке фреймворка.
TCC быстрее, к тому же для меня важна именно библиотека libtcc.dll, которая и содержит функции, позволяющие на лету компилировать С-код.
p.s. За using каюсь... спасибо
В .NET есть API для вызова указанных компиляторов, они умеют собирать в рантайме динамические сборки, существующие только в течении времени жизни домена приложения. Естественно, проблема взаимодействия со сторонним кодом становится прозрачной настолько, насколько это позволяет .NET.
Ага. Т.е. какоето (видимо достаточно большое) колчиество кода на Tiny C уже есть?
Хмм, вашей задачи не знаю, поэтому судить о производительности не берусь.
Совершенно верно. Вполне достаточный объем, чтобы отказаться от его переписывания (13000 строк).
Я бы не хотел ходить вокруг да около. Если возможно, то подскажите, пожалуйста, что необходимо сделать, чтобы компилировался код с использованием сторонних функций.
Покидал по указанному пути необходимые *.h файлы. Ругаться на #include перестал. Но теперь выдает ошибку после tcc_relocate, если использовать, скажем, sin() из math.h
Покидал по указанному пути необходимые *.h файлы. Ругаться на #include перестал. Но теперь выдает ошибку после tcc_relocate, если использовать, скажем, sin() из math.h
уважаемый, бросьте это безнадежное дело! если используете эти глупые винформы на с++ то скомпильте свой сишный код в длл и дружите его с дотнет, или же откажитесь от них! а вообще хотите писать на дотнет пишите на шарпе, хотите на с++ берите для гуи кьют!