EricWF added a comment.

In https://reviews.llvm.org/D28441#639023, @smeenai wrote:

> One potential issue with always forcing the non-debug msvcrt is that any apps 
> that link against libc++ would also then need to use the non-debug CRT 
> libraries, otherwise you'd get all sorts of fun runtime errors (e.g. 
> cross-domain frees). I think the default Visual Studio settings are to link 
> against `msvcrtd`, `ucrtd`, etc. for debug builds and `msvcrt`, `ucrt`, etc. 
> for release builds, so having libc++ unconditionally use the non-debug 
> versions is probably bad for interoperability.


I agree. Forcing the use of release libraries is just a starting point.

> I think the right thing to do would be to either always compile two versions 
> of libc++, one linked against the debug libraries and the other against the 
> non-debug libraries, or make the Debug configuration use the debug libraries 
> and the Release configuration use the release libraries (and have `config.py` 
> deal with this as well).

Is it OK if this is implemented *after* this patch?



================
Comment at: CMakeLists.txt:43
+if (WIN32 AND NOT MINGW)
+  set(LIBCXX_TARGETING_WINDOWS ON)
+else()
----------------
rnk wrote:
> smeenai wrote:
> > EricWF wrote:
> > > EricWF wrote:
> > > > smeenai wrote:
> > > > > Not the biggest fan of this name, since it's not obvious why MinGW 
> > > > > shouldn't count as targeting Windows. I thought of 
> > > > > `LIBCXX_TARGETING_NATIVE_WINDOWS` or `LIBCXX_TARGETING_MSVCRT` 
> > > > > instead, but MinGW is also native Windows and targets MSVCRT, so 
> > > > > those names aren't any better from that perspective either. I can't 
> > > > > think of anything else at the moment, but I'm sure there's a better 
> > > > > name.
> > > > Thanks for the feedback. I'm not exactly sure how this macro should be 
> > > > defined either.
> > > > 
> > > > I thought that `MinGW` provided its own C library runtime wrappers that 
> > > > forward to `MSVCRT`. 
> > > > 
> > > > The difference I was imagining between Native Windows builds and 
> > > > `MinGW` is that it's possible to use
> > > > `pthread` with `MinGW` but not with native Windows targets. 
> > > Another distinction I would like this macro to embody is whether on not 
> > > the compiler defines `_MSC_VER`.  `clang-cl`, `clang++`  on Windows, and 
> > > MSVC `cl` all define this macro.
> > If I recall correctly, MinGW uses `mscvrt.dll` but not `msvcrt.lib` (see my 
> > other comment for the distinction). I'm fine with this name for now then; 
> > we can always bikeshed later.
> > 
> > Btw it's also possible to use pthread with native Windows targets, via 
> > [pthreads-win32](http://www.sourceware.org/pthreads-win32/) or other 
> > libraries.
> I'd call this LIBCXX_TARGETING_MSVCRT. "msvcrt.dll" usually refers to an 
> ancient version (6?) of the Visual C runtime that is distributed as part of 
> Windows. Typically it is found at C:/Windows/system32/msvcrt.dll. Mingw uses 
> this, because it is available on all Windows systems they care to support. 
> This DLL basically never receives updates, so I wouldn't want to build libc++ 
> functionality on top of it. Over time, it seems that mingw has had to 
> implement more and more C runtime functionality itself, and I wouldn't want 
> libc++ to have to do that.
> 
> Until recently, MSVC users were required to redistribute the version of the 
> CRT they chose to link against, and it was expected that all DLLs sharing CRT 
> resources had to link against the same CRT version. Of course, this caused 
> problems, so they went back to the single, OS-provided CRT in VS 2015 
> (https://blogs.msdn.microsoft.com/vcblog/2015/03/03/introducing-the-universal-crt/).
> 
> My conclusion is that it's no longer worth thinking of that old DLL as the 
> Visual C runtime. It's just an artifact of history at this point. If you say 
> libc++ targets the MSVCRT, you're probably talking about the modern, 
> universal CRT.
> 
> ---
> 
> If you want this option to imply both the C++ ABI and the C runtime, then 
> LIBCXX_TARGETING_MSVC would probably be a more appropriate name. Clang and 
> LLVM have some support for using the Itanium C++ ABI with the MSVCRT, but it 
> is more experimental, and not ABI compatible with any existing software. 
> Saleem could say more about where he thinks this target will go in the future 
> and whether it's worth adding to the libc++ support configuration matrix.
> My conclusion is that it's no longer worth thinking of that old DLL as the 
> Visual C runtime. It's just an artifact of history at this point. If you say 
> libc++ targets the MSVCRT, you're probably talking about the modern, 
> universal CRT.

According to the [docs](https://msdn.microsoft.com/en-us/library/abx4dbyh.aspx) 
`msvcrt` now contains the "startup files" for the universal CRT.

> If you want this option to imply both the C++ ABI and the C runtime, then 
> LIBCXX_TARGETING_MSVC would probably be a more appropriate name.

Ack. Changing it to `LIBCXX_TARGETING_MSVC`  and enabling it using the `MSVC` 
CMake variable.



================
Comment at: lib/CMakeLists.txt:112
+  add_library_flags(vcruntime) # C++ runtime
+  add_library_flags(msvcrt) # C runtime startup files
+  add_library_flags(iso_stdio_wide_specifiers)
----------------
smeenai wrote:
> EricWF wrote:
> > halyavin wrote:
> > > halyavin wrote:
> > > > As far as I know, applications shouldn't use msvcrt.dll ([[ 
> > > > https://blogs.msdn.microsoft.com/oldnewthing/20140411-00/?p=1273 | 
> > > > Windows is not a Microsoft Visual C/C++ Run-Time delivery channel ]]) 
> > > > Can we survive on ucrt only?
> > > Oh, it is static library that doesn't correspond to a dll.
> > I don't think that link suggests that applications shouldn't link 
> > `msvcrt.dll`. 
> > 
> > Instead all of the doc I see suggests that `msvcrt.dll` is linked 
> > implicitly by `/MD`. However since libc++ removes `/MD` and adds 
> > `/nodefaultlibs` we need to manually re-create the `/MD` link without the 
> > MSVC STL. That involves manually linking `msvcrt.dll`.
> There's a distinction between `msvcrt.lib` and `msvcrt.dll`. `msvcrt.lib` is 
> a static library which contains the entry point (`_DllMainCRTStartup@12`, 
> etc.). It's basically the equivalent of crtbegin for Windows. `msvcrt.dll` is 
> the unversioned legacy version of the C runtime, which is what you're not 
> supposed to use. It's kinda confusing since the normal convention is for 
> `X.lib` to be the import library corresponding to `X.dll`, but that's not the 
> case for `msvcrt`.
`msvcrt.dll` doesn't exist anymore according to 
[this](https://msdn.microsoft.com/en-us/library/abx4dbyh.aspx)


https://reviews.llvm.org/D28441



_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to