Although this can happen for many reasons, the architecuture
of Conjecture is such that if you are not aware of what
Conjecture is doing, multiple-definition-of errors will
src/ directory contains
subdirectories defining all of the C++ classes necessary
to compile Conjecture. The
designed to automatically maintain all dependencies
between files, and to ensure that a file is always
compiled if any file it depends on is modified. Note
that this is the purpose of a Makefile, but few Makefiles
actually take care to ensure that all dependencies
are accounted for.
It is important to remember note that the
Makefile finds and compiles EVERY
*.cc file in the entire directory
hierarchy (i.e. all sub-directories are searched
too). This means that you cannot create a "backup"
or "old" directory within
src; such code
will be automatically detected and compiled by the
Makefile. Since backups imply that there is a "non-backup"
that presumably defines the same class(es), the Makefile
will encounter multiple definitions of the same class and
naturally generate "multiple definition of" errors.
The current solution is to put all backups outside the
src/ directory. As a trivial future-works
project, extensions can be added to
src/Makefile to ignore certain directory
names within the
src/ directory hierarchy.
src directory has multiple
sub-directories (and sub-sub-directories, etc.), but all
directories contribute to the overall
conjecture executable. Currently,
subdirectory Makefiles usually perform a simple delegation
of targets to the
src/Makefile. For most
targets, this produces the desired behavior, but some
special-case targets need to be addressed specially, and
you may encounter a target that doesn't do what you expect
This "problem" may or may not go away when we move to
autoconf environment. The "inheritance"
of targets has advantages that compensate for this
(presumably rare) potential problem.