UTAP / APHTTP

simple web framework over C++
MIT License
21 stars 10 forks source link

Build on Windows Machine #4

Open AmRo045 opened 3 years ago

AmRo045 commented 3 years ago

How can I build this library on the Windows machine?

make command output on Windows 10:

g++ -std=c++11 -Wall -pedantic -c utils/utilities.cpp -o build/utilities.o
utils/utilities.cpp: In function 'int readMapFromFile(std::__cxx11::string, std::map<std::__cxx11::basic_string<char>, std::__cxx11::basic_string<char> >*)':
utils/utilities.cpp:221:35: error: no matching function for call to 'getline(char**, size_t*, FILE*&)'
   while (getline(&buf, &buflen, fp) > 0) {
                                   ^
In file included from c:\mingw\lib\gcc\mingw32\6.3.0\include\c++\string:53:0,
                 from c:\mingw\lib\gcc\mingw32\6.3.0\include\c++\stdexcept:39,
                 from c:\mingw\lib\gcc\mingw32\6.3.0\include\c++\array:39,
                 from c:\mingw\lib\gcc\mingw32\6.3.0\include\c++\tuple:39,
                 from c:\mingw\lib\gcc\mingw32\6.3.0\include\c++\bits\stl_map.h:63,
                 from c:\mingw\lib\gcc\mingw32\6.3.0\include\c++\map:61,
                 from utils/utilities.hpp:4,
                 from utils/utilities.cpp:1:
c:\mingw\lib\gcc\mingw32\6.3.0\include\c++\bits\basic_string.tcc:1509:5: note: candidate: template<class _CharT, class _Traits, class _Alloc> std::basic_istream<_CharT, _Traits>& std::getline(std::basic_istream<_CharT, _Traits>&, std::__cxx11::basic_string<_CharT, _Traits, _Alloc>&, _CharT)
     getline(basic_istream<_CharT, _Traits>& __in,
     ^~~~~~~
c:\mingw\lib\gcc\mingw32\6.3.0\include\c++\bits\basic_string.tcc:1509:5: note:   template argument deduction/substitution failed:
utils/utilities.cpp:221:35: note:   mismatched types 'std::basic_istream<_CharT, _Traits>' and 'char**'
   while (getline(&buf, &buflen, fp) > 0) {
                                   ^
In file included from c:\mingw\lib\gcc\mingw32\6.3.0\include\c++\string:52:0,
                 from c:\mingw\lib\gcc\mingw32\6.3.0\include\c++\stdexcept:39,
                 from c:\mingw\lib\gcc\mingw32\6.3.0\include\c++\array:39,
                 from c:\mingw\lib\gcc\mingw32\6.3.0\include\c++\tuple:39,
                 from c:\mingw\lib\gcc\mingw32\6.3.0\include\c++\bits\stl_map.h:63,
                 from c:\mingw\lib\gcc\mingw32\6.3.0\include\c++\map:61,
                 from utils/utilities.hpp:4,
                 from utils/utilities.cpp:1:
c:\mingw\lib\gcc\mingw32\6.3.0\include\c++\bits\basic_string.h:5365:5: note: candidate: template<class _CharT, class _Traits, class _Alloc> std::basic_istream<_CharT, _Traits>& std::getline(std::basic_istream<_CharT, _Traits>&, std::__cxx11::basic_string<_CharT, _Traits, _Alloc>&)
     getline(basic_istream<_CharT, _Traits>& __is,
     ^~~~~~~
c:\mingw\lib\gcc\mingw32\6.3.0\include\c++\bits\basic_string.h:5365:5: note:   template argument deduction/substitution failed:
utils/utilities.cpp:221:35: note:   mismatched types 'std::basic_istream<_CharT, _Traits>' and 'char**'
   while (getline(&buf, &buflen, fp) > 0) {
                                   ^
In file included from c:\mingw\lib\gcc\mingw32\6.3.0\include\c++\string:52:0,
                 from c:\mingw\lib\gcc\mingw32\6.3.0\include\c++\stdexcept:39,
                 from c:\mingw\lib\gcc\mingw32\6.3.0\include\c++\array:39,
                 from c:\mingw\lib\gcc\mingw32\6.3.0\include\c++\tuple:39,
                 from c:\mingw\lib\gcc\mingw32\6.3.0\include\c++\bits\stl_map.h:63,
                 from c:\mingw\lib\gcc\mingw32\6.3.0\include\c++\map:61,
                 from utils/utilities.hpp:4,
                 from utils/utilities.cpp:1:
aits, class _Alloc> std::basic_istream<_CharT, _Traits>& std::getline(std::basic_istream<_CharT, _Traits>&&, std::__cxx11::basic_string<_CharT, _Traits, _Alloc>&, _CharT)
     getline(basic_istream<_CharT, _Traits>&& __is,
     ^~~~~~~
c:\mingw\lib\gcc\mingw32\6.3.0\include\c++\bits\basic_string.h:5373:5: note:   template argument deduction/substitution failed:
utils/utilities.cpp:221:35: note:   mismatched types 'std::basic_istream<_CharT, _Traits>' and 'char**'
   while (getline(&buf, &buflen, fp) > 0) {
                                   ^
In file included from c:\mingw\lib\gcc\mingw32\6.3.0\include\c++\string:52:0,
                 from c:\mingw\lib\gcc\mingw32\6.3.0\include\c++\stdexcept:39,
                 from c:\mingw\lib\gcc\mingw32\6.3.0\include\c++\array:39,
                 from c:\mingw\lib\gcc\mingw32\6.3.0\include\c++\tuple:39,
                 from c:\mingw\lib\gcc\mingw32\6.3.0\include\c++\bits\stl_map.h:63,
                 from c:\mingw\lib\gcc\mingw32\6.3.0\include\c++\map:61,
                 from utils/utilities.hpp:4,
                 from utils/utilities.cpp:1:
c:\mingw\lib\gcc\mingw32\6.3.0\include\c++\bits\basic_string.h:5380:5: note: candidate: template<class _CharT, class _Traits, class _Alloc> std::basic_istream<_CharT, _Traits>& std::getline(std::basic_istream<_CharT, _Traits>&&, std::__cxx11::basic_string<_CharT, _Traits, _Alloc>&)
     getline(basic_istream<_CharT, _Traits>&& __is,
     ^~~~~~~
c:\mingw\lib\gcc\mingw32\6.3.0\include\c++\bits\basic_string.h:5380:5: note:   template argument deduction/substitution failed:
utils/utilities.cpp:221:35: note:   mismatched types 'std::basic_istream<_CharT, _Traits>' and 'char**'
   while (getline(&buf, &buflen, fp) > 0) {
                                   ^
make: *** [makefile:22: build/utilities.o] Error 1
hadisfr commented 3 years ago

Hi! Unfortunately, we do not support Windows and MinGW officially. It seems that we have used non-POSIX gcc-specific old-C-style getline there, which is not available in MinGW (See https://stackoverflow.com/q/27381903). If you have found any workaround, merge-requests are appreciated. :D

Do you have any solution? 🤔 @gsoosk @sadmanbrad

AmRo045 commented 3 years ago

I think we can change the implementation of readMapFromFile method from this: https://github.com/UTAP/APHTTP/blob/03a8239280e43d1185c197e42392832608c5c42c/utils/utilities.cpp#L209-L246 to this:

int readMapFromFile(std::string fname, std::map<std::string, std::string> *m) {
  ifstream inputStream(fname);
  std::string line;

  if (inputStream.fail())
    return -errno;

  while (getline(inputStream, line)) {
    auto tokens = tokenize(line, '=');
    //     KEY         VALUE
    (*m)[tokens[0]] = tokens[1];
  }

  return (*m).size();
}
hadisfr commented 3 years ago

Thank you. Your code seems much cleaner than the old one. :D I did not remember internals of library, so I'll ask someone else to review it and apply the patch if everything is OK. A MR will be appreciated, too. :D