2015-10-05 1 views
2

Je suis en train de remplacer un disque codé préprocesseurChemin du fichier avec CMake add_definitions

#define MY_FILE_PATH "/usr/local/myfile" 

avec add_definitions dans CMake

add_definitions(-DMY_FILE_PATH=${MY_FILE_PATH}) 

et tout en appelant CMake J'utilise -DMY_FILE_PATH=/usr/tmp/myfile mais obtenir toutes sortes d'erreurs, par exemple , expression primaire attendue avant le jeton '/' et tmp ne trouve pas etc. Est-il possible d'utiliser add_definitions dans mon scénario ou dois-je essayer configure_file. add_definitions ne prend-il en charge que des valeurs entières?

+2

Avez-vous essayé de lui échapper avec des guillemets? –

+0

Oui, c'était la première chose que j'ai essayé mais la même erreur. Bien que si je fais écho avec des guillemets, il l'affiche correctement. J'utilise zsh. – user1566277

Répondre

0

Votre code d'origine a défini la macro sur un littéral de chaîne, mais votre code CMake la définit en une séquence de jetons. En d'autres mots, vous avez laissé tomber les guillemets.

les Rajouter lors de l'appel CMake:

-DMY_FILE_PATH="/usr/tmp/myfile" 

(Vous pourriez avoir à échapper correctement pour votre shell).

+0

La commande qui a fonctionné jusqu'à présent sur mon zsh $ '"/ usr/tmp/myfile"' – user1566277

-1

Dans le cas où une personne fait face au même problème, j'ai trouvé la bonne solution, entre guillemets nécessaires ici add_definitions (-DMY_FILE_PATH = $ « {MY_FILE_PATH} ») Cela résout le problème. Après cela juste -DMY_FILE_PATH = "/ usr/tmp/myfile" fonctionne très bien.

-1

Sous Windows, a fonctionné pour moi:

set(INT_TESTDATA_DIR ${CMAKE_CURRENT_SOURCE_DIR}/testdata) 
add_definitions(-DTESTDATA_DIR=R\"\(${INT_TESTDATA_DIR}\)\") 

TESTDATA_DIR est alors définie comme:

#define TESTDATA_DIR R"(C:/aaa/bbbb/ccc/testdata)" 
3

Aucune des réponses ici et de googler Internet a fonctionné pour moi (CMake 3.4.1 sur Les fenêtres). J'ai finalement trouvé une solution, alors voilà, j'espère que cela aidera quelqu'un:

L'astuce consiste à citer l'ensemble du contenu de chaque définition que vous voulez ajouter avec add_definitions, pas seulement la partie valeur de celui-ci, et échapper les citations intérieures qui iront à la coquille. Rappelez-vous que chaque définition devrait consister en une chaîne séparée. Comme ceci:

add_definitions("-D_SOME_DEFINE=\"Some value with spaces, etc\"" "-D DEF1=\"Another string\"") 

La réponse n'est pas retenu uniquement aux chemins, mais est applicable à toute chaîne générale que vous souhaitez fournir une directive préprocesseur. C'est la seule façon de fournir une chaîne contenant des caractères d'espace.