[gmx-developers] compiling with c++
David van der Spoel
spoel at xray.bmc.uu.se
Sun Jun 27 12:44:16 CEST 2010
On 2010-06-26 23.21, Sander Pronk wrote:
> I tried it a couple of days ago and didn't find anything that couldn't be fixed. The recent power outage in Stockholm has prevented me from fixing things, though.
> Did you find anything particularly worrisome?
>
> Sander
>
It seems hard to believe that anyone successfully compiled the whole
gromacs with c++ recently...
In single precision, warnings
/Users/spoel/GG/gromacs/src/gmxlib/selection/compiler.c: In function
‘void init_root_item(t_selelem*,
gmx_ana_index_t*)’:/Users/spoel/GG/gromacs/src/gmxlib/selection/compiler.c:2289:
warning: comparison between ‘enum e_selelem_t’ and ‘enum e_selvalue_t’
and some more for assignment of char * to constant strings.
Resolution: ignored
Errors:
/Users/spoel/GG/gromacs/src/gmxlib/selection/mempool.c: In function
‘void _gmx_s
el_mempool_free(gmx_sel_mempool_t*, void*)’:
/Users/spoel/GG/gromacs/src/gmxlib/selection/mempool.c:169: error:
invalid conversion from ‘void*’ to ‘char*’
/Users/spoel/GG/gromacs/src/gmxlib/gmx_sort.c: In function ‘void
qsort_swapfunc(void*, void*, size_t, int)’:
/Users/spoel/GG/gromacs/src/gmxlib/gmx_sort.c:43: error: invalid
conversion from ‘void*’ to ‘int*’
/Users/spoel/GG/gromacs/src/gmxlib/gmx_sort.c:44: error: invalid
conversion from ‘void*’ to ‘int*’
/Users/spoel/GG/gromacs/src/gmxlib/gmx_sort.c:54: error: invalid
conversion from ‘void*’ to ‘char*’
/Users/spoel/GG/gromacs/src/gmxlib/gmx_sort.c:55: error: invalid
conversion from ‘void*’ to ‘char*’
/Users/spoel/GG/gromacs/src/gmxlib/gmx_sort.c: In function ‘void*
qsort_med3(void*, void*, void*, int (*)())’:
/Users/spoel/GG/gromacs/src/gmxlib/gmx_sort.c:72: error: too many
arguments to function
/Users/spoel/GG/gromacs/src/gmxlib/gmx_sort.c:74: error: too many
arguments to function
/Users/spoel/GG/gromacs/src/gmxlib/gmx_sort.c:76: error: too many
arguments to function
/Users/spoel/GG/gromacs/src/gmxlib/gmx_sort.c:83: error: too many
arguments to function
/Users/spoel/GG/gromacs/src/gmxlib/gmx_sort.c:85: error: too many
arguments to function
etc.
In both mempool.c and gmx_sort.c I've added type casts, however these
are not trivial, so it would be good if the authors (Teemu?, Berk?)
check these.
/Users/spoel/GG/gromacs/src/gmxlib/mtxio.c: In function ‘void
gmx_mtxio_write(const char*, int, int, real*,
gmx_sparsematrix_t*)’:/Users/spoel/GG/gromacs/src/gmxlib/mtxio.c:135:
error: cannot convert ‘bool*’ to
‘int*’ for argument ‘2’ to ‘bool gmx_fio_doe_int(t_fileio*, int*,
const char*, const char*,
int)’/Users/spoel/GG/gromacs/src/gmxlib/mtxio.c: In function ‘void
gmx_mtxio_read(con
st char*, int*, int*, real**, gmx_sparsematrix_t**)’:
/Users/spoel/GG/gromacs/src/gmxlib/mtxio.c:219: error: cannot convert
‘bool*’ to ‘int*’ for argument ‘2’ to ‘bool gmx_fio_doe_int(t_fileio*,
int*, const char*, const char*, int)’
These are more tricky: the C++ type bool is not compatible with int.
Removing the check for booleans
AC_CHECK_TYPES([bool])
in configure.ac makes matters worse rather than better.
I introduced new functions gmx_fio_doe_bool and gmx_fio_ndoe_bool that
converts the bool to an int before writing/reading (in order to keep
compatible files!).
I replaced the gmx_fio_do_int function by gmx_fio_do_bool also in tpxio.c:
/Users/spoel/GG/gromacs/src/gmxlib/tpxio.c:464: error: cannot convert
‘bool*’ to ‘int*’ for argument ‘2’ to ‘bool gmx_fio_doe_int(t_fileio*,
int*, const char*, const char*, int)’
/Users/spoel/GG/gromacs/src/gmxlib/tpxio.c:466: error: cannot convert
‘bool*’ to ‘int*’ for argument ‘2’ to ‘bool gmx_fio_doe_int(t_fileio*,
int*, const char*, const char*, int)’
and so on...
/Users/spoel/GG/gromacs/include/smalloc.h: In function ‘void
_snew_aligned(const char*, const char*, int, T*&, size_t, size_t,
size_t) [with T = real]’:
/Users/spoel/GG/gromacs/src/mdlib/tables.c:914: instantiated from here
/Users/spoel/GG/gromacs/include/smalloc.h:195: error: invalid conversion
from ‘const char*’ to ‘char*’
/Users/spoel/GG/gromacs/include/smalloc.h:195: error: initializing
argument 1 of ‘void* save_calloc_aligned(char*, char*, int, unsigned
int, size_t, size_t)’
/Users/spoel/GG/gromacs/include/smalloc.h:195: error: invalid conversion
from ‘const char*’ to ‘char*’
/Users/spoel/GG/gromacs/include/smalloc.h:195: error: initializing
argument 2 of ‘void* save_calloc_aligned(char*, char*, int, unsigned
int, size_t, size_t)’
Fixed this by twice adding a typecast to (char *) in the template code
in smalloc.h line 195.
/Users/spoel/GG/gromacs/src/mdlib/qm_orca.c: In function ‘real
read_orca_output(
real (*)[3], real (*)[3], int, t_forcerec*, t_QMrec*,
t_MMrec*)’:/Users/spoel/GG/gromacs/src/mdlib/qm_orca.c:248: warning:
format ‘%s’ expects type ‘char*’, but argument 3 has type ‘int*’
Replace %s by %d
g_membed wouldn't compile because gmx_ana.h wasn't included leading to
name mangling problems.
Then there is a clash between X-windows and MPI: both define a typedef
Status. Duh! Removed g_showcol from compilation list to side-step this
issue.
Another tip: I usually compile in separate object directories rather
than in the source tree. It is a good idea to remove the src etc. before
you run configure. Now I had a src/gmxlib/version.h from february lying
around there which was incorrect and caused linking errors.
Now in double precision:
Undefined symbols:
"_nb_kernel430_x86_64_sse2", referenced from:
kernellist_x86_64_sse2 in
libgmx_mpi_d.a(nb_kernel_x86_64_sse2.o)
"_nb_kernel410_x86_64_sse2", referenced from:
kernellist_x86_64_sse2 in
libgmx_mpi_d.a(nb_kernel_x86_64_sse2.o)
"_nb_kernel400_x86_64_sse2", referenced from:
kernellist_x86_64_sse2 in
libgmx_mpi_d.a(nb_kernel_x86_64_sse2.o)
This is a name mangling problem and it is fixed by including the
appropriate header file into the c-files. By the way the comment in this
file still says:
* This file is generated automatically at compile time
* by the program mknb in the Gromacs distribution.
I don't think that is correct anymore, is it?
So please test compiling in single and double precision as well as with
with C compile and C++ compiler.
I have committed these patches, and now everything compiles.
--
David van der Spoel, Ph.D., Professor of Biology
Dept. of Cell & Molec. Biol., Uppsala University.
Box 596, 75124 Uppsala, Sweden. Phone: +46184714205.
spoel at xray.bmc.uu.se http://folding.bmc.uu.se
More information about the gromacs.org_gmx-developers
mailing list