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.