andrewwutw/build-djgpp

Standard library issues

sagamusix opened this issue · 12 comments

I am using the pre-built djgpp package (gcc 7.1.0, Linux Mint 32-bit).
As far as I can see, there is a complete, up-to-date standard library coming with it, just as I expected, but somehow I cannot access most of it.

test.cpp:

#include <string>
int main()
{
std::string s;
std::wstring w;
return 0;
}

Result of g++ test.cpp:

test.cpp: In function 'int main()':
test.cpp:5:6: error: 'wstring' is not a member of 'std'
 std::wstring w;
      ^~~~~~~
test.cpp:5:6: note: suggested alternative: 'isprint'
 std::wstring w;
      ^~~~~~~
      isprint

Running cc1plus -v shows that, as far as I can tell, all relevant include paths from the downloaded package are listed.

Is this a known issue? What am I doing wrong?

Are you using g++ instead of i586-pc-msdosdjgpp-g++?

I was following the examples in the readme, i.e. I tried both the export variant and the source BASE_DIR/setenv, and then used g++. After doing so, g++ does indeed point to djgpp rather than the system-provided g++, but i586-pc-msdosdjgpp-g++ is not found.

What does g++ -v return?

What does i586-pc-msdosdjgpp-g++ return?

You should have both in your path from build-djgpp.

What is BASE_DIR?

What shell are you using?

What does env return?

Since I am using the pre-compiled package (not enough space in my virtual machine to build my own), there was no build-djgpp involved.

If I just run source BASE_DIR/setenv as described in the manual, g++ still refers to the system-provided g++. So I try

export PATH=BASE_DIR/i586-pc-msdosdjgpp/bin/:$PATH
export GCC_EXEC_PREFIX=BASE_DIR/lib/gcc/

With BASE_DIR obviously replaced as instructed in the manual.

Now I get:

> g++ -v
Using built-in specs.
COLLECT_GCC=g++
COLLECT_LTO_WRAPPER=/home/jojo/djgpp/lib/gcc/../../libexec/gcc/i586-pc-msdosdjgpp/7.1.0/lto-wrapper
Target: i586-pc-msdosdjgpp
Configured with: ../gnu/gcc-7.10/configure --target=i586-pc-msdosdjgpp --program-prefix=i586-pc-msdosdjgpp- --prefix=/usr/local/djgpp --disable-nls --disable-plugin --disable-lto --enable-lto --enable-libquadmath-support --with-gmp=/home/vagrant/build-djgpp/build/djcross-gcc-7.1.0/tmpinst --with-mpfr=/home/vagrant/build-djgpp/build/djcross-gcc-7.1.0/tmpinst --with-mpc=/home/vagrant/build-djgpp/build/djcross-gcc-7.1.0/tmpinst --enable-version-specific-runtime-libs --enable-languages=c,c++
Thread model: single
gcc version 7.1.0 (GCC)

> i586-pc-msdosdjgpp-g++
i586-pc-msdosdjgpp-g++: command not found

What shell are you using?

I'm using bash.

Maybe it's a doc bug, but I usually set my export PATH=$BASE_DIR/bin:$PATH and use the full name of the compiler and then set CC in my Makefiles or ./configure script. I don't recall having to use GCC_EXEC_PREFIX and $BASE_DIR/setenv script also sets the var DJDIR which is a djgpp-ism.

My guess is that calling the compiler via g++ and possibly export'ing the wrong PATH causes g++ to use cc1plus from the system which gets confused about -I paths and uses /usr/include instead.

I tried export PATH=$BASE_DIR/bin:$PATH followed by i586-pc-msdosdjgpp-g++ test.cpp but the compilation error remains: string is recognized, wstring is not. Really strange because even running i586-pc-msdosdjgpp-cpp test.cpp shows that the correct include files appear to be preprocssed. In the preprocessed output, I don't see a single trance of wstring. std::u32string and std::u16string are available though, so my next guess would be that for some reason, std::wstring is missing entirely in djgpp? I also tried using std::round which is missing even when specifying -std=c++11, certainly all of these standard library functions cannot be missing while all the other recent stuff is in there? My hope is still that this is a user error and not a problem with the precompiled package or djgpp itself. :)

Try adding #include <wchar.h> at the top of the source. Maybe you're hitting this delta [0] of djgpp's headers/c++ lib?

[0] https://www.thecodingforums.com/threads/wstring-wcout-in-gcc-under-djgpp-cygwin.290393/

Sadly that also doesn't solve the problem, std::wstring is still not available. Given that std::round is also not available (despite specifying -std=c++11, I think something more profound is going wrong.

It seems the official DOS version of DJGPP (http://www.delorie.com/djgpp/) doesn't support wstring neither. Maybe it is a bug or limitation of DJGPP?

I feared this might be the issue (and it seems rather weird given that u16string and u32string are supported). I guess I'll have to find out what exactly from the standard library is available and what isn't...

@sagamusix I asked this question on DJGPP mailing list, the answer is that DJGPP doesn't support wide character / multi byte string.

So, I think unless someone implements these functions in DJGPP source code, this problem can't be fixed. 😢

See:
http://www.delorie.com/djgpp/mail-archives/browse.cgi?p=djgpp/2017/07/21/08:57:06
http://www.delorie.com/djgpp/mail-archives/browse.cgi?p=djgpp/2017/07/21/18:25:23

Thanks for taking the time to report it on the mailing list. :) Too bad that nothing can be done about it right now, but also good to know that it was not a problem with the usage of the precompiled package.