2012-06-20 13 views
6

Estoy intentando utilizar la importación de módulos básicos en D (versión de idioma 2). Como guía, utilicé un ejemplo en dlang.org pero mi programa simple no se compilará. Los archivos están en el mismo directorio.Importación de módulos en D

Aquí es el contenido de mi archivo main.d:

import std.stdio; 
import mymodule; 

void main(string[] args){ 
    sayHello(); 
    writeln("Executing Main"); 
} 

Y aquí es el contenido de mi archivo de módulo (mymodule.d):

void sayHello(){ 
    writeln("hello"); 

} 

para compilar lo ejecutan a través de bash:

dmd main.d 

Y el resultado del error es:

main.o: In function `_Dmain': 
main.d:(.text._Dmain+0x5): undefined reference to `_D8mymodule8sayHelloFZv' 
collect2: ld returned 1 exit status 
--- errorlevel 1 
+4

Pruebe 'dmd mymodule.d main.d' –

+0

Eso funcionó. Publique como una respuesta adecuada para que pueda darle el reconocimiento. ¡Te lo mereces! Incluso si no te importan los puntos, al menos de esa manera puedo marcar la pregunta como respondida. – RedMage

+1

Solo use rdmd --build-only main.d. – Trass3r

Respuesta

9
  1. Debe enumerar todos los módulos que está compilando en la línea de comandos. Si no enumera un módulo, entonces no se compilará. Los módulos que son compilados podrán utilizar los módulos no compilados, ya que el compilador extrae sus declaraciones, pero el compilador no genera ningún archivo de objeto para ellos. Entonces, cuando el enlazador vaya a enlazar, se quejará de que faltan definiciones. En este caso, se queja del hecho de que mymodule.sayHello no ha sido definido.

    Si desea que el compilador busque automáticamente todos los módulos que el primer módulo importe y compile todos ellos para usted, entonces necesitará usar rdmd, que es un contenedor para dmd, que viene con dmd. dmd en sí mismo no hace eso. Solo compila los módulos que le dices.

  2. No ha importado std.stdio en mymodule. Por lo tanto, incluso si hace dmd main.d mymodule.d como debería (o mejor aún, dmd -w main.d mymodule.d o dmd -wi main.d mymodule.d), no podrá compilar mymodule, porque writeln no ha sido declarado. El hecho de que main.d lo haya importado no tiene ningún efecto en mymodule.

  3. Si bien no es un gran problema en este caso, realmente debe poner una declaración module modulename; en la parte superior de sus módulos. El compilador inferirá el nombre del módulo del nombre del archivo, pero una vez que tenga subpaquetes, necesita para hacerlo, o tendrá problemas de importación, porque solo se deduce el nombre del archivo, no los nombres del paquete. Por lo tanto, si tiene foo/bar/mod.d y no tiene una declaración module en mod.d, se inferirá como mod, no como foo.bar.mod.

4

dmd mymodule.d main.d

Los únicos idiomas que conozco que son lo suficientemente inteligente como para trabajar por su cuenta dependencias son Ir y Haskell.

+2

'rdmd' resolverá las dependencias. 'rdmd main.d' construiría el archivo y todas las dependencias y ejecutaría el resultado. Si solo desea compilar, agregue '--build-only' al comando. – eco

+0

Me encanta esa función en Haskell. Ojalá D lo tuviera también. – Arlen

+2

Para ser pedante, no creo que ni Go ni Haskell tengan esa característica, sino más bien sus compiladores. Un compilador de D conforme podría tenerlo también. – BCS

Cuestiones relacionadas