<html>
    <head>
      <base href="https://bugs.llvm.org/">
    </head>
    <body><table border="1" cellspacing="0" cellpadding="8">
        <tr>
          <th>Bug ID</th>
          <td><a class="bz_bug_link 
          bz_status_NEW "
   title="NEW - Clang_cl precompiled headers causes missing symbols"
   href="https://bugs.llvm.org/show_bug.cgi?id=41394">41394</a>
          </td>
        </tr>

        <tr>
          <th>Summary</th>
          <td>Clang_cl precompiled headers causes missing symbols
          </td>
        </tr>

        <tr>
          <th>Product</th>
          <td>clang
          </td>
        </tr>

        <tr>
          <th>Version</th>
          <td>8.0
          </td>
        </tr>

        <tr>
          <th>Hardware</th>
          <td>PC
          </td>
        </tr>

        <tr>
          <th>OS</th>
          <td>Linux
          </td>
        </tr>

        <tr>
          <th>Status</th>
          <td>NEW
          </td>
        </tr>

        <tr>
          <th>Severity</th>
          <td>enhancement
          </td>
        </tr>

        <tr>
          <th>Priority</th>
          <td>P
          </td>
        </tr>

        <tr>
          <th>Component</th>
          <td>Driver
          </td>
        </tr>

        <tr>
          <th>Assignee</th>
          <td>unassignedclangbugs@nondot.org
          </td>
        </tr>

        <tr>
          <th>Reporter</th>
          <td>linux@carewolf.com
          </td>
        </tr>

        <tr>
          <th>CC</th>
          <td>llvm-bugs@lists.llvm.org, neeilans@live.com, richard-llvm@metafoo.co.uk
          </td>
        </tr></table>
      <p>
        <div>
        <pre>With the latest clang_cl 8.0 we have tried reenabling using precompiled headers
for clang_cl on Windows with Qt.

Unfortunately it doesn't work and causes very long list of undefined symbols at
link time. All the missing symbols reported as referenced from PCH object file.
The symbols can be both from in and outside of the library, almost all inline
templated methods such as various forms of basic_string<T> methods.

There are several ways to work around the issue, most avoiding linking with PCH
object file:
1) Not linking in the pch object file and doing a debug build
2) Not linking in the pch object file and compiling all other files with
/Zc:dllexportInlines-
3) Not linking in the pch object file and compiling all other files with
-Xclang -building-pch-with-obj
4) Manually instantiating ALL templated classes possibly used by inline methods
(e.g. template class std::basic_string<char>). Note this is not necessary with
any other compiler.

They first three work-arounds all achieve the same goal of making the methods
generated in the PCH object file redundant, making linking with the buggy
object file unnecessary.

The issue simply appears to be that templated inline methods are partially
generated, but the template instantiations they need are not. Likely the
generated methods should been discarded unless used by another file in the
library.

In general it seems the far easiest to use a similar strategy as on non-windows
platform and let the normal object files generate the inline symbols they need,
even if that generates them more than necessary.

I have tried making a few simple cases, but the issue resists reproduction with
small examples and appears to require a larger library before it triggers.

Tell me if you need more information.</pre>
        </div>
      </p>


      <hr>
      <span>You are receiving this mail because:</span>

      <ul>
          <li>You are on the CC list for the bug.</li>
      </ul>
    </body>
</html>