11
votes

Définition de la variable globale Lua_Path de C ++ / C?

J'essaie de définir ma variable globale Lua_Path directement à partir de C / C ++, j'utilise Lua à partir de mes applications iPhone, alors mon chemin a tendance à changer entre les applications (chaque application iPhone dispose d'un dossier séparé de l'appareil).

Je sais que je pourrais mettre le Lua_Path en recompilant Lua avec un chemin "fixe", mais c'est assez loin d'être idéal.

(J'essaie de le faire pour pouvoir utiliser besoin , de mon .Lua scripts.

Quelqu'un pourrait-il m'aider ici?


0 commentaires

7 Réponses :


0
votes

Je suppose que cela ne sera pas possible depuis, comme vous la métimérisez, pour des raisons de sécurité, chaque application iPhone vit dans sa proprebasse de sable.

Je pense qu'utiliser setenv définira la variable d'environnement uniquement pour le processus en cours et ses enfants.

Et d'ailleurs: Si vous envisagez de soumettre votre application à l'AppStore (autant que je sache) les langues de script / interprètes sont fobdries par le contrat que vous avez signé.


2 commentaires

Je crois qu'ils avaient l'habitude d'être interdit mais ne le sont plus.


@ Caadmg2 peut-être j'ai raté quelque chose. Je pense que personne ne lit jamais en détail les changements et ajouts fréquents au contrat



0
votes
setenv ( "LUA_PATH", (char *)my_path, 1 );

0 commentaires

3
votes

Vous pouvez également modifier package.Path in Lua avant d'appeler exiger .


0 commentaires

-1
votes

Je ne suis pas trop familier avec le développement de l'iPhone, mais pouvez-vous définir la variable Lua_Path env avant d'exécuter votre application?

Par exemple, à Linux, je pourrais écrire un script qui exécute votre binaire comme: P >

export LUA_PATH="foo"
/path/to/executable


3 commentaires

Ou env lua_path = "foo" / chemin / à / exécutable .


Je ne pense pas que Lua_Path est une variable d'environnement.


Ce n'est pas une réponse à la question.



20
votes

en C ++:

int setLuaPath( lua_State* L, const char* path )
{
    lua_getglobal( L, "package" );
    lua_getfield( L, -1, "path" ); // get field "path" from table at top of stack (-1)
    std::string cur_path = lua_tostring( L, -1 ); // grab path string from top of stack
    cur_path.append( ";" ); // do your path magic here
    cur_path.append( path );
    lua_pop( L, 1 ); // get rid of the string on the stack we just pushed on line 5
    lua_pushstring( L, cur_path.c_str() ); // push the new one
    lua_setfield( L, -2, "path" ); // set the field "path" in table at -2 with value at top of stack
    lua_pop( L, 1 ); // get rid of package table from top of stack
    return 0; // all done!
}


0 commentaires

4
votes

Objc: Suivant de l'autre réponse, voici ce qui fonctionne pour moi. L'Ajout de "/?.lua" est nécessaire.

int setLuaPath( NSString* path )  
{
    lua_getglobal( L, "package" );
    lua_getfield( L, -1, "path" ); // get field "path" from table at top of stack (-1)
    NSString * cur_path = [NSString stringWithUTF8String:lua_tostring( L, -1 )]; // grab path string from top of stack
    cur_path = [cur_path stringByAppendingString:@";"]; // do your path magic here
    cur_path = [cur_path stringByAppendingString:path];
    cur_path = [cur_path stringByAppendingString:@"/?.lua"];
    lua_pop( L, 1 ); // get rid of the string on the stack we just pushed on line 5
    lua_pushstring( L, [cur_path UTF8String]); // push the new one
    lua_setfield( L, -2, "path" ); // set the field "path" in table at -2 with value at top of stack
    lua_pop( L, 1 ); // get rid of package table from top of stack
    return 0; // all done!
}

   ... add this code somewhere, near where you lua_open() for example

   // Set Lua's Package.path to where our Lua files can be found
   NSString *luaPath = [[NSBundle mainBundle] pathForResource:@"name of any one of my lua files" ofType:@"lua"];
   setLuaPath([luaPath stringByDeletingLastPathComponent]);
   ...


1 commentaires

Cela fonctionne parfaitement, merci. Exactement ce que je cherchais.



3
votes

Vous pouvez définir le Lua_Path et lua_cpath au sein de C ++ très facilement en exécutant une liste de fonctions LUAL_DOSTRING.

luaL_dostring(L, "package.path = package.path .. ';?.lua'");
luaL_dostring(L, "package.cpath = package.cpath .. ';?.dll'");


2 commentaires

J'ai essayé cela, mais lual_dostring retour et erreur. Le message que je reçois est tenter d'indexer une valeur nulle (global 'package')


Tourne effectivement que je recevais cette erreur parce que je n'appelais pas lual_openlibs (l) . Cette solution fonctionne si le paquet lib est chargé correctement