marbl / Winnowmap

Long read / genome alignment software
Other
235 stars 22 forks source link

Compile issue: error: ‘lrint’ is not a member of ‘std’ #36

Closed Gray-Tu closed 1 year ago

Gray-Tu commented 1 year ago

Hi Thank you for this tool. I have some human WGS ONT data and want to analysis SV events. I try to compile Winnowmap but I got an error:

utility/src/utility/types.H:162:51: error: ‘lrint’ is not a member of ‘std’

and only winnowmap in bin folder (meryl doesn't find.)

My OS is CentOS 7 and gcc version is 5.4.0

gcc --version
gcc (GCC) 5.4.0
Copyright (C) 2015 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

How can I do?

Best, Gray

Gray-Tu commented 1 year ago

[add] the full stdout is

make -e -C src
make[1]: Entering directory `/home/ONT/tools/git_clone/Winnowmap/src'
make[1]: Nothing to be done for `all'.
make[1]: Leaving directory `/home/ONT/tools/git_clone/Winnowmap/src'
g++ -g -Wall -O2 -DHAVE_KALLOC -fopenmp -std=c++11 -Wno-sign-compare -Wno-write-strings -Wno-unused-but-set-variable                                                                                              -fno-tree-vectorize  src/main.o -o bin/winnowmap -Lsrc -lwinnowmap -lm -lz -lpthread
make -C ext/meryl/src TARGET_DIR=/home/ONT/tools/git_clone/Winnowmap
Building snapshot v1.3
For 'Linux' '3.10.0-1160.49.1.el7.x86_64' as 'amd64' into '/home/ONT/tools/git_clone/Winnowmap/{bin,obj}'.
Using '/usr/local/bin/g++' version '5.4.0'.

make[1]: Entering directory `/home/ONT/tools/git_clone/Winnowmap/ext/meryl/src'
g++ -o /home/ONT/tools/git_clone/Winnowmap/ext/meryl/build/obj/lib/libmeryl.a/utility/src/utility/edlib.o -c -MD -g3                                                                                              -O4 -funroll-loops -fexpensive-optimizations -finline-functions -fomit-frame-pointer -Wall -Wextra -Wformat -Wno-ch                                                                                             ar-subscripts -Wno-sign-compare -Wno-unused-function -Wno-unused-parameter -Wno-unused-variable -Wno-deprecated-decl                                                                                             arations -Wno-format-truncation -std=c++17 -pthread -fopenmp -fPIC -DNOBACKTRACE -I/home/ONT/tools/git_clone/Winnowm                                                                                             ap/ext/meryl/src -Imeryl -Iutility utility/src/utility/edlib.C
g++ -o /home/ONT/tools/git_clone/Winnowmap/ext/meryl/build/obj/lib/libmeryl.a/utility/src/utility/files.o -c -MD -g3                                                                                              -O4 -funroll-loops -fexpensive-optimizations -finline-functions -fomit-frame-pointer -Wall -Wextra -Wformat -Wno-ch                                                                                             ar-subscripts -Wno-sign-compare -Wno-unused-function -Wno-unused-parameter -Wno-unused-variable -Wno-deprecated-decl                                                                                             arations -Wno-format-truncation -std=c++17 -pthread -fopenmp -fPIC -DNOBACKTRACE -I/home/ONT/tools/git_clone/Winnowm                                                                                             ap/ext/meryl/src -Imeryl -Iutility utility/src/utility/files.C
g++ -o /home/ONT/tools/git_clone/Winnowmap/ext/meryl/build/obj/lib/libmeryl.a/utility/src/utility/files-buffered.o -                                                                                             c -MD -g3 -O4 -funroll-loops -fexpensive-optimizations -finline-functions -fomit-frame-pointer -Wall -Wextra -Wforma                                                                                             t -Wno-char-subscripts -Wno-sign-compare -Wno-unused-function -Wno-unused-parameter -Wno-unused-variable -Wno-deprec                                                                                             ated-declarations -Wno-format-truncation -std=c++17 -pthread -fopenmp -fPIC -DNOBACKTRACE -I/home/ONT/tools/git_clon                                                                                             e/Winnowmap/ext/meryl/src -Imeryl -Iutility utility/src/utility/files-buffered.C
g++ -o /home/ONT/tools/git_clone/Winnowmap/ext/meryl/build/obj/lib/libmeryl.a/utility/src/utility/files-compressed.o                                                                                              -c -MD -g3 -O4 -funroll-loops -fexpensive-optimizations -finline-functions -fomit-frame-pointer -Wall -Wextra -Wfor                                                                                             mat -Wno-char-subscripts -Wno-sign-compare -Wno-unused-function -Wno-unused-parameter -Wno-unused-variable -Wno-depr                                                                                             ecated-declarations -Wno-format-truncation -std=c++17 -pthread -fopenmp -fPIC -DNOBACKTRACE -I/home/ONT/tools/git_cl                                                                                             one/Winnowmap/ext/meryl/src -Imeryl -Iutility utility/src/utility/files-compressed.C
In file included from utility/src/utility/edlib.H:45:0,
                 from utility/src/utility/edlib.C:42:
utility/src/utility/types.H: In function ‘int64 doubletoint64(double)’:
utility/src/utility/types.H:161:51: error: ‘llrint’ is not a member of ‘std’
 inline  int64  doubletoint64(double d)   { return(std::llrint(d)); }
                                                   ^
utility/src/utility/types.H:161:51: note: suggested alternative:
In file included from /usr/include/features.h:375:0,
                 from /usr/include/stdio.h:27,
                 from utility/src/utility/types.H:48,
                 from utility/src/utility/edlib.H:45,
                 from utility/src/utility/edlib.C:42:
/usr/include/bits/mathcalls.h:327:1: note:   ‘llrint’
 __MATHDECL (long long int,llrint,, (_Mdouble_ __x));
 ^
In file included from utility/src/utility/edlib.H:45:0,
                 from utility/src/utility/edlib.C:42:
utility/src/utility/types.H: In function ‘int32 doubletoint32(double)’:
utility/src/utility/types.H:162:51: error: ‘lrint’ is not a member of ‘std’
 inline  int32  doubletoint32(double d)   { return(std:: lrint(d)); }
                                                   ^
utility/src/utility/types.H:162:51: note: suggested alternative:
In file included from /usr/include/features.h:375:0,
                 from /usr/include/stdio.h:27,
                 from utility/src/utility/types.H:48,
                 from utility/src/utility/edlib.H:45,
                 from utility/src/utility/edlib.C:42:
/usr/include/bits/mathcalls.h:326:1: note:   ‘lrint’
 __MATHDECL (long int,lrint,, (_Mdouble_ __x));
 ^
In file included from utility/src/utility/files.H:23:0,
                 from utility/src/utility/files-buffered.C:20:
utility/src/utility/types.H: In function ‘int64 doubletoint64(double)’:
utility/src/utility/types.H:161:51: error: ‘llrint’ is not a member of ‘std’
 inline  int64  doubletoint64(double d)   { return(std::llrint(d)); }
                                                   ^
utility/src/utility/types.H:161:51: note: suggested alternative:
In file included from /usr/include/features.h:375:0,
                 from /usr/include/stdio.h:27,
                 from utility/src/utility/types.H:48,
                 from utility/src/utility/files.H:23,
                 from utility/src/utility/files-buffered.C:20:
/usr/include/bits/mathcalls.h:327:1: note:   ‘llrint’
 __MATHDECL (long long int,llrint,, (_Mdouble_ __x));
 ^
In file included from utility/src/utility/files.H:23:0,
                 from utility/src/utility/files-buffered.C:20:
utility/src/utility/types.H: In function ‘int32 doubletoint32(double)’:
utility/src/utility/types.H:162:51: error: ‘lrint’ is not a member of ‘std’
 inline  int32  doubletoint32(double d)   { return(std:: lrint(d)); }
                                                   ^
utility/src/utility/types.H:162:51: note: suggested alternative:
In file included from /usr/include/features.h:375:0,
                 from /usr/include/stdio.h:27,
                 from utility/src/utility/types.H:48,
                 from utility/src/utility/files.H:23,
                 from utility/src/utility/files-buffered.C:20:
/usr/include/bits/mathcalls.h:326:1: note:   ‘lrint’
 __MATHDECL (long int,lrint,, (_Mdouble_ __x));
 ^
In file included from utility/src/utility/files.H:23:0,
                 from utility/src/utility/files.C:20:
utility/src/utility/types.H: In function ‘int64 doubletoint64(double)’:
utility/src/utility/types.H:161:51: error: ‘llrint’ is not a member of ‘std’
 inline  int64  doubletoint64(double d)   { return(std::llrint(d)); }
                                                   ^
utility/src/utility/types.H:161:51: note: suggested alternative:
In file included from /usr/include/features.h:375:0,
                 from /usr/include/stdio.h:27,
                 from utility/src/utility/types.H:48,
                 from utility/src/utility/files.H:23,
                 from utility/src/utility/files.C:20:
/usr/include/bits/mathcalls.h:327:1: note:   ‘llrint’
 __MATHDECL (long long int,llrint,, (_Mdouble_ __x));
 ^
In file included from utility/src/utility/files.H:23:0,
                 from utility/src/utility/files.C:20:
utility/src/utility/types.H: In function ‘int32 doubletoint32(double)’:
utility/src/utility/types.H:162:51: error: ‘lrint’ is not a member of ‘std’
 inline  int32  doubletoint32(double d)   { return(std:: lrint(d)); }
                                                   ^
utility/src/utility/types.H:162:51: note: suggested alternative:
In file included from /usr/include/features.h:375:0,
                 from /usr/include/stdio.h:27,
                 from utility/src/utility/types.H:48,
                 from utility/src/utility/files.H:23,
                 from utility/src/utility/files.C:20:
/usr/include/bits/mathcalls.h:326:1: note:   ‘lrint’
 __MATHDECL (long int,lrint,, (_Mdouble_ __x));
 ^
In file included from utility/src/utility/files.H:23:0,
                 from utility/src/utility/files-compressed.C:20:
utility/src/utility/types.H: In function ‘int64 doubletoint64(double)’:
utility/src/utility/types.H:161:51: error: ‘llrint’ is not a member of ‘std’
 inline  int64  doubletoint64(double d)   { return(std::llrint(d)); }
                                                   ^
utility/src/utility/types.H:161:51: note: suggested alternative:
In file included from /usr/include/features.h:375:0,
                 from /usr/include/stdio.h:27,
                 from utility/src/utility/types.H:48,
                 from utility/src/utility/files.H:23,
                 from utility/src/utility/files-compressed.C:20:
/usr/include/bits/mathcalls.h:327:1: note:   ‘llrint’
 __MATHDECL (long long int,llrint,, (_Mdouble_ __x));
 ^
In file included from utility/src/utility/files.H:23:0,
                 from utility/src/utility/files-compressed.C:20:
utility/src/utility/types.H: In function ‘int32 doubletoint32(double)’:
utility/src/utility/types.H:162:51: error: ‘lrint’ is not a member of ‘std’
 inline  int32  doubletoint32(double d)   { return(std:: lrint(d)); }
                                                   ^
utility/src/utility/types.H:162:51: note: suggested alternative:
In file included from /usr/include/features.h:375:0,
                 from /usr/include/stdio.h:27,
                 from utility/src/utility/types.H:48,
                 from utility/src/utility/files.H:23,
                 from utility/src/utility/files-compressed.C:20:
/usr/include/bits/mathcalls.h:326:1: note:   ‘lrint’
 __MATHDECL (long int,lrint,, (_Mdouble_ __x));
 ^
At global scope:
cc1plus: warning: unrecognized command line option ‘-Wno-format-truncation’
make[1]: *** [/home/ONT/tools/git_clone/Winnowmap/ext/meryl/build/obj/lib/libmeryl.a/utility/src/utility/files-buffe                                                                                             red.o] Error 1
make[1]: *** Waiting for unfinished jobs....
At global scope:
cc1plus: warning: unrecognized command line option ‘-Wno-format-truncation’
At global scope:
cc1plus: warning: unrecognized command line option ‘-Wno-format-truncation’
make[1]: *** [/home/ONT/tools/git_clone/Winnowmap/ext/meryl/build/obj/lib/libmeryl.a/utility/src/utility/files.o] Er                                                                                             ror 1
make[1]: *** [/home/ONT/tools/git_clone/Winnowmap/ext/meryl/build/obj/lib/libmeryl.a/utility/src/utility/files-compr                                                                                             essed.o] Error 1
At global scope:
cc1plus: warning: unrecognized command line option ‘-Wno-format-truncation’
make[1]: *** [/home/ONT/tools/git_clone/Winnowmap/ext/meryl/build/obj/lib/libmeryl.a/utility/src/utility/edlib.o] Er                                                                                             ror 1
make[1]: Leaving directory `/home/ONT/tools/git_clone/Winnowmap/ext/meryl/src'
make: *** [winnowmap] Error 2
cjain7 commented 1 year ago

Try including cmath and see if it resolves the error.

Make the code change in this file https://github.com/marbl/Winnowmap/blob/45078cfa10de38a5521c21fb80d3ee3b06e4060d/ext/meryl/src/utility/src/utility/types.H#L48

Add #include <cmath>

Reference: https://www.enseignement.polytechnique.fr/informatique/INF478/docs/Cpp/en/cpp/numeric/math/rint.html

Gray-Tu commented 1 year ago

@cjain7 Thank you for your advice

After I add #inculde <cmath> in the header file, the error was solved.

But I got another error is

g++ -o /home/ONT/tools/git_clone/Winnowmap/ext/meryl/build/obj/lib/libmeryl.a/utility/src/utility/bits.o -c -MD -g3 -O4 -funroll-loops -fexpensive-optimizations -finline-functions -fomit-frame-pointer -Wall -Wextra -Wformat -Wno-char-subscripts -Wno-sign-compare -Wno-unused-function -Wno-unused-parameter -Wno-unused-variable -Wno-deprecated-declarations -Wno-format-truncation -std=c++17 -pthread -fopenmp -fPIC -DNOBACKTRACE -I/home/ONT/tools/git_clone/Winnowmap/ext/meryl/src -Imeryl -Iutility utility/src/utility/bits.C
utility/src/utility/bits.C:56:42: error: expected ‘,’ before ‘)’ token
 static_assert(__fibNum(45) < __fibNum(46));  //  Fails if 32-bit signed
                                          ^
utility/src/utility/bits.C:56:42: error: expected string-literal before ‘)’ token
utility/src/utility/bits.C:57:42: error: expected ‘,’ before ‘)’ token
 static_assert(__fibNum(46) < __fibNum(47));  //  Fails if 32-bit unsigned
                                          ^
utility/src/utility/bits.C:57:42: error: expected string-literal before ‘)’ token
utility/src/utility/bits.C:58:42: error: expected ‘,’ before ‘)’ token
 static_assert(__fibNum(91) < __fibNum(92));  //  Fails if 64-bit signed
                                          ^
utility/src/utility/bits.C:58:42: error: expected string-literal before ‘)’ token

should I open another issue for that ?

Best, Gray

brianwalenz commented 1 year ago

Hi Gray-

First, did you do anything other than git clone winnowmap; make, like updating the meryl/ or utility/ submodules? If so, in winnowmap itself, do a git submodule update to reset their state to what winnowmap is expecting.

Your logging shows Using '/usr/local/bin/g++' version '5.4.0'. and it's entirely possible that doesn't fully support the C++ features I'm using here. The fix is reasonably simple: add an empty string as a second parameter in those static_assert() calls:

 static_assert(__fibNum(46) < __fibNum(47), "failed");  //  Fails if 32-bit unsigned

An alternative (potential) solution is to change -std=c++11 in Makefile to -std=c++17.

Gray-Tu commented 1 year ago

@brianwalenz, Thank you for your advice

I modified the Winnowmap/ext/meryl/src/utility/src/utility/types.H (thanks cjain7) to solve ‘lrint’ issue.

Now I finished compliing meryl after adding a "fail" string in static_assert() in Winnowmap/ext/meryl/src/utility/src/utility/bits.C

Here is the modified code:

static_assert(__fibNum(45) < __fibNum(46), "fail");  //  Fails if 32-bit signed
static_assert(__fibNum(46) < __fibNum(47), "fail");  //  Fails if 32-bit unsigned
static_assert(__fibNum(91) < __fibNum(92), "fail");  //  Fails if 64-bit signed
//atic_assert(__fibNum(92) < __fibNum(93));  //  Always fails.

Very thanks Gray