How to import modules?

js.mdnq js_adddot+mdng at gmail.com
Tue Dec 4 08:53:32 PST 2012


On Tuesday, 4 December 2012 at 07:17:15 UTC, Mike Parker wrote:
> On Tuesday, 4 December 2012 at 04:31:40 UTC, js.mdnq wrote:
>> I created a .d file having a class with the modules tag at the
>> top and everything public. I put it in a dir and used the -I 
>> flag
>> to include the path. When I import the file I get an undefined
>> method.
>>
>> 1. Do I need to compile the .d file into a lib or can I just
>> import the .d and have it included directly. This is easier so 
>> I
>> don't have to recompile when switching compilers.(to gdc)
>
> The import statement simply tells the compiler which symbols 
> are visible. The compiler will not compile imported modules for 
> you. Given module foo.d, which imports bar.d, your command line 
> should look like this:
>
> dmd -I/path/to/bar bar.d foo.d
>
> Imports tell the compiler which symbols are available, but the 
> compiler will not automatically compile imported modules. 
> You'll have to do one of four things:
>
> 1) specify each source module on the command line so that each 
> can be compiled and linked
>
> 2) compile each source module individually and then manually 
> link the object files yourself
>
> 3) compile the imported files into a library and link with it
>
> 4) use a build tool like rdmd which parses all the imports 
> makes sure they are all compiled.
>
> The only time it's possible to import a module without linking 
> it is when it is full of compile time symbols, such as 
> templates that are declared there but never instantiated, 
> manifest constants, etc...
>
>>
>> 2. Do I have to mark anything extern in the module?
>
> No.
>
>>
>>
>> In C/C++ one can just include the header, which contains code 
>> and
>> it will work. In D, it seems like one has to link in the 
>> methods
>> regardless? (at least when using the `imports <filename>`)
>
> When the C or C++ source is in the header, this works because 
> the preprocessor directly merges the content of the header with 
> the source file that includes it. When the source is in a 
> separate file and only the interface is in the header, the 
> source files need to be compiled and linked. D compilers do not 
> perform any sort of substitution or merging like the C 
> preprocessor. Each module is compiled into an object file, just 
> as C or C++ source files are, and each must be linked into the 
> executable.
>
>
>>
>> What I'm looking for is to get D to include the module using 
>> the
>> D file directly unless it exists in a lib file. (or at least
>> compile to a lib file and include it behind the scenes)
>
> No D compiler does this. But rdmd, which ships with dmd, does.
>
>>
>>
>>
>> I'm also using dot notation.
>>
>> module/import MyModules.ThisModule; then the path looks like
>> \Imports\MyModules\ThisModule.d. Not sure if this is the 
>> correct
>> way to organize modules or not.
>
> That is correct, though the prevailing convention is to use 
> lowercase module names.

Thanks, I simply imported the modules into the project and I 
guess visual D added them to be compiled in on the command line. 
For now this will work fine.  Maybe eventually I'll write a 
utility that will build up a command line to include all the d 
files in a subdirectory for compilation.


More information about the Digitalmars-d-learn mailing list