2011-03-04 16 views
5

Tengo un proyecto que se compila en múltiples plataformas ... Windows, Unix, Linux, SCO, nombre su sabor.Recuperar el nombre de destino de salida como una cadena en tiempo de compilación en C++

Me gustaría rellenar el nombre del destino de salida en una variable en el código fuente del proyecto (el nombre del programa de salida, DLL, biblioteca SO o lo que sea) para poder utilizarlo en los mensajes como una forma genérica de referencia nombre del componente ya sea un archivo EXE en Windows, un archivo DLL, una biblioteca de SO en Unix, etc.

lo que estoy pensando es una clave preprocesador como FUNCIÓN _ pero algo para tirar el nombre del archivo EXE/DLL en Windows en Visual C++, y luego en la biblioteca de salida SO en GCC. Esos probablemente sean dos mecanismos diferentes, por supuesto, pero creo que los combinaré en una sola opción que puedo utilizar genéricamente en mi código multiplataforma.

Así que un macro'ish cosa o algo que puedo llamar que al menos recoge el nombre de archivo de salida de Windows durante la compilación (Visual C++) para poder insertarlo en una cadena de caracteres en el código, y tal vez una forma de hacerlo lo mismo en GCC para que las dos plataformas se puedan envolver en una sola abstracción. Preferiblemente no recogido en el tiempo de ejecución pero capturado y persistido durante la compilación.

Si la salida es una biblioteca, entonces es el nombre del archivo lib. Si es un componente, entonces el nombre del archivo de componente de salida.

Espero que Boost o Poco ya tengan algo como esto con algunos puntos finales no admitidos, lo que está bien.

Respuesta

8

Si todo está unido bajo un proyecto, puede usar una macro de preprocesador. Para hacer esto en Visual Studio, abra las propiedades de su proyecto y vaya a Configuración de propiedades> C/C++> Preprocesador y agregue algo como PROGRAM_NAME="\"$(ProjectName)\"" al campo Definiciones de preprocesador (que corresponde a la opción del compilador /Dfoo=bar).

Para GCC, utilice la opción de línea de comando -Dfoo=bar similar. Por ejemplo, su Makefile podría ser algo como esto:

PROGRAM_NAME = myapplication 
CFLAGS += '-DEXECUTABLE_NAME="$(PROGRAM_NAME)"' 

# Rule to make the executable from the object files 
$(PROGRAM_NAME): $(OBJS) 
    $(LD) $(OBJS) -o [email protected] $(LDFLAGS) 

# Rule to make object files from C source files 
%.o: %.c 
    $(CC) $(CFLAGS) -c $< -o [email protected] 

Esto permite que los archivos de origen para utilizar la macro PROGRAM_NAME, que se ampliará a la cadena constante "myapplication" en este caso.

Sin embargo, si tiene archivos de objeto que están vinculados en varios programas (por ejemplo, tiene muchos códigos de biblioteca compartidos que pueden ejecutarse mediante el controlador de programa principal o varias suites de prueba), los archivos de objeto pueden ' Saber con qué ejecutable están vinculados antes de tiempo, por lo que deben determinarlo en tiempo de ejecución.

En ese caso, use una variable global constante para almacenar el nombre del programa, y ​​defina e inicialice eso en el archivo fuente principal de cada ejecutable utilizando la técnica anterior.

+0

¡Gracias, había olvidado la sintaxis! – psycho

1

El compilador no puede saber esto. Es el enlazador que asigna un nombre. Diría que su mejor apuesta es una definición, o tiempo de ejecución que determina el nombre del módulo (que no funcionará para las librerías estáticas)

1

Otra solución, un poco hacky, sería establecer su cadena const en el código a un valor único, fácil de localizar y lo suficientemente grande y después de hacer el enlace localizar & sobrescribir el valor único con el nombre real del archivo estás operando en ...

Cuestiones relacionadas