title: Importance of compiling single-threaded v. multi-threaded (and lib naming conventions)?
body: <p><strong>[ EDIT ] ==></strong>
  To clarify, in those environments where multiple targets are deployed to the same directory, Planet Earth has decided on a convention to append "<code>d</code>" or "<code>_d</code>" or "<code>_debug</code>" to the "<code>DEBUG</code>" version (of a library or executable).  Such a convention can be considered "ubiquitous" and "understood", although (of course) not everybody does this.</p>
  
  <p>SIMILARLY, to resolve ambiguity between "shared" and "static" versions of a library, a common convention is to append something to distinguish between the static-and-shared (like "<code>myfile.lib</code>" for shared-import-lib-on-Windows and "<code>myfile_s.lib</code>" for static-import-lib-on-Windows).  While Posix does not have this ambiguity based on file extension, remember that the file extension is not used on the "link line", so it is similarly useful to be able to explicitly specify the "static" or "shared" version of a library.</p>
  
  <p>For the purpose of this question, both "<code>debug/release</code>" and "<code>static/shared</code>" are promoted to <em>"ubiquitous convention to decorate the file name root"</em>.</p>
  
  <p><strong><em>QUESTION:</em>  Does any other deployment configuration get "promoted" to this level of "ubiquitous convention" such that it would become explicit in the file target root name?</strong></p>
  
  <p>My current guess is "no".  For the answer to be "Yes", it would require:  More than one configuration for given target is intended to be "used" (and thus deployed to a common directory, which is the assumed basis for the question).</p>
  
  <p>In the past, we compiled with-and-without "web plug-in" capability, which similarly required that name decoration, but we no longer build those targets (so I won't assert that as an example).  Similarly, we sometimes compile with-and-without multi-byte character support, but I hate that, so I won't assert that either.</p>
  
  <p><strong>[ORIGINAL QUESTION]</strong></p>
  
  <p>We're <strong>establishing library naming conventions</strong>/policy, <strong>to be applied across languages and platforms</strong> (e.g., we support hybrid products using several languages on different platforms, including C/C++, C#, Java).  A particular goal is to ensure we handle targets/resources for mobile development (which is new to us) in addition to our traditional desktop (and embedded) applications.</p>
  
  <p>Of course, <em>one</em> option is to have different paths for targets from different build configurations.  For the purpose of this question, the decision is made to have all targets co-locate to a single directory, and to "decorate" the library/resource/executable name to avoid collisions based on build configuration (e.g., "DEBUG" v. "RELEASE", "static lib" v. "shared/DLL", etc.)</p>
  
  <p>Current decision is similar to others on the web, where we append tokens to avoid naming collisions:</p>
  
  <pre><code>  MyName.lib           (release build, import for shared/dll)
    MyName_s.lib         (release build, static lib)
  
    MyName_d.lib         (debug build, import for shared/DLL)
    MyName_ud.lib        (Unicode/wide-char, debug, import for shared/DLL)
    MyName_usd.lib       (Unicode/wide-char, static lib, debug)
  </code></pre>
  
  <p>(The above are Windows examples, but these policies similarly apply to our POSIX systems.)</p>
  
  <p>These are based on:</p>
  
  <pre><code>  d     (release or debug)
    u     (ASCII or Unicode/wide-char)
    s     (shared/DLL or static-lib)
  </code></pre>
  
  <p><em>QUESTION:</em>  We do not have legacy applications that must be compiled single-threaded, and my understanding is that (unlike Microsoft) POSIX systems can link single- and multi-threaded targets into a single application without issue.  Given today's push towards multi-core and multi-threaded, <strong>Is there a need in a <em>large enterprise</em> to establish the following to identify "single-" versus "multi-threaded" compiled targets?</strong></p>
  
  <pre><code>  t       (single-threaded or multi-threaded)  *(??needed??)*
  </code></pre>
  
  <p><strong>...and did we miss any other target collision, like compile with-and-without STL (on C++)?</strong></p>
  
  <p>As an aside, Microsoft has library naming conventions at:
  <a href="http://msdn.microsoft.com/en-us/library/aa270400(v=vs.60).aspx" rel="nofollow noreferrer">http://msdn.microsoft.com/en-us/library/aa270400(v=vs.60).aspx</a> and their DLL naming conventions at: <a href="http://msdn.microsoft.com/en-us/library/aa270964(v=vs.60).aspx" rel="nofollow noreferrer">http://msdn.microsoft.com/en-us/library/aa270964(v=vs.60).aspx</a></p>
  
  <p>A similar question on SO a year ago that didn't talk about threading and didn't reference the Microsoft conventions can be found at: <a href="https://stackoverflow.com/questions/2140129/what-is-proper-naming-convention-for-msvc-dlls-static-libraries-and-import-libra">What is proper naming convention for MSVC dlls, static libraries and import libraries</a></p>