<div dir="ltr"><div class="gmail_default" style="font-family:'courier new',monospace">I know that one cannot link static libraries together; they're just archives of objects, really.  But since CMake abstracts the actual construction of the library, it could conceivably know how to do the right thing and collect all the needed objects recursively, as it appears to do for executables.  It seems it does not know how to do this.  Hence, I believe the section of the wiki quoted below is thus in error, as it implies this kind of transitive linking resolution can be done.  I've made it work using OBJECT libraries, but as I originally mentioned, I'm really trying for the simplest, most basic kind CMakeLists.txt syntax possible so as to allow my automation to do most of the work (I have a very large source tree).  Thanks.</div><div class="gmail_default" style="font-family:'courier new',monospace"><br></div><div class="gmail_default" style="font-family:'courier new',monospace">Quote:</div><div class="gmail_default" style="font-family:'courier new',monospace"><p style="margin:0.4em 0px 0.5em;line-height:19.049999237060547px;color:rgb(0,0,0);font-family:sans-serif;font-size:13px">For example, we can create two subdirectories:</p><pre style="padding:1em;border:1px dashed rgb(47,111,171);color:rgb(0,0,0);background-color:rgb(249,249,249);line-height:1.1em"># A/CMakeLists.txt
add_library(A ${A_srcs})

# B/CMakeLists.txt
add_library(B ${B_srcs})
</pre><p style="margin:0.4em 0px 0.5em;line-height:19.049999237060547px;color:rgb(0,0,0);font-family:sans-serif;font-size:13px">and then refer to those libraries from the top directory:</p><pre style="padding:1em;border:1px dashed rgb(47,111,171);color:rgb(0,0,0);background-color:rgb(249,249,249);line-height:1.1em"># CMakeLists.txt
add_subdirectory(A)
add_subdirectory(B)
add_library(big ${other_srcs})
target_link_libraries(big A B)
</pre><p style="margin:0.4em 0px 0.5em;line-height:19.049999237060547px;color:rgb(0,0,0);font-family:sans-serif;font-size:13px">This approach is easy to use and helps organize the project source tree. Since CMake tracks link dependencies automatically it is easy to refer to the "<code style="background-color:rgb(249,249,249)">big</code>" library in <code style="background-color:rgb(249,249,249)">target_link_libraries</code> calls elsewhere in the project and let CMake propagate the dependency on A and B.</p><p style="margin:0.4em 0px 0.5em;line-height:19.049999237060547px;color:rgb(0,0,0);font-family:sans-serif;font-size:13px"><br></p><p style="margin:0.4em 0px 0.5em;line-height:19.049999237060547px;color:rgb(0,0,0);font-family:sans-serif;font-size:13px"><br></p></div></div><div class="gmail_extra"><br><div class="gmail_quote">On Wed, Nov 26, 2014 at 6:52 AM, Mueller-Roemer, Johannes Sebastian <span dir="ltr"><<a href="mailto:Johannes.Sebastian.Mueller-Roemer@igd.fraunhofer.de" target="_blank">Johannes.Sebastian.Mueller-Roemer@igd.fraunhofer.de</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">





<div lang="DE" link="blue" vlink="purple">
<div>
<p class="MsoNormal"><span lang="EN-US" style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1f497d">Sorry overread the last point in your mail. I don’t believe there is a way to avoid this directly. What you seem to want is what Xcode calls a
 prelinked library (<a href="http://cocoadev.com/SingleObjectPrelink" target="_blank">http://cocoadev.com/SingleObjectPrelink</a>) . CMake does not have such an option as far as I know<u></u><u></u></span></p><span class="">
<p class="MsoNormal"><span lang="EN-US" style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1f497d"><u></u> <u></u></span></p>
<div>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1f497d">--<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1f497d">Johannes S. Mueller-Roemer, MSc<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1f497d">Wiss. Mitarbeiter - Interactive Engineering Technologies (IET)<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1f497d"><u></u> <u></u></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1f497d">Fraunhofer-Institut für Graphische Datenverarbeitung IGD<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1f497d">Fraunhoferstr. 5  |  64283 Darmstadt  |  Germany<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1f497d">Tel <a href="tel:%2B49%206151%20155-606" value="+496151155606" target="_blank">+49 6151 155-606</a>  |  Fax <a href="tel:%2B49%206151%20155-139" value="+496151155139" target="_blank">+49 6151 155-139</a><u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1f497d"><a href="mailto:johannes.mueller-roemer@igd.fraunhofer.de" target="_blank">johannes.mueller-roemer@igd.fraunhofer.de</a>  |  <a href="http://www.igd.fraunhofer.de" target="_blank">www.igd.fraunhofer.de</a><u></u><u></u></span></p>
</div>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1f497d"><u></u> <u></u></span></p>
</span><div>
<div style="border:none;border-top:solid #b5c4df 1.0pt;padding:3.0pt 0in 0in 0in">
<p class="MsoNormal"><b><span lang="EN-US" style="font-size:10.0pt;font-family:"Tahoma","sans-serif"">From:</span></b><span lang="EN-US" style="font-size:10.0pt;font-family:"Tahoma","sans-serif""> Mueller-Roemer, Johannes Sebastian
<br>
<b>Sent:</b> Wednesday, November 26, 2014 13:50<br>
<b>To:</b> 'Chris Johnson'; <a href="mailto:cmake@cmake.org" target="_blank">cmake@cmake.org</a><br>
<b>Subject:</b> RE: [CMake] Creating a library from subdirectories<u></u><u></u></span></p>
</div>
</div><span class="">
<p class="MsoNormal"><u></u> <u></u></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1f497d">In the example on that site an OBJECT library is created (the output consists of multiple .obj files), you used STATIC libraries instead (which
 each output a single .lib)<u></u><u></u></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1f497d"><u></u> <u></u></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1f497d">--<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1f497d">Johannes S. Mueller-Roemer, MSc<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1f497d">Wiss. Mitarbeiter - Interactive Engineering Technologies (IET)<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1f497d"><u></u> <u></u></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1f497d">Fraunhofer-Institut für Graphische Datenverarbeitung IGD<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1f497d">Fraunhoferstr. 5  |  64283 Darmstadt  |  Germany<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1f497d">Tel <a href="tel:%2B49%206151%20155-606" value="+496151155606" target="_blank">+49 6151 155-606</a>  |  Fax <a href="tel:%2B49%206151%20155-139" value="+496151155139" target="_blank">+49 6151 155-139</a><u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1f497d"><a href="mailto:johannes.mueller-roemer@igd.fraunhofer.de" target="_blank">johannes.mueller-roemer@igd.fraunhofer.de</a>  | 
<a href="http://www.igd.fraunhofer.de" target="_blank">www.igd.fraunhofer.de</a><u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1f497d"><u></u> <u></u></span></p>
<p class="MsoNormal"><b><span lang="EN-US" style="font-size:10.0pt;font-family:"Tahoma","sans-serif"">From:</span></b><span lang="EN-US" style="font-size:10.0pt;font-family:"Tahoma","sans-serif""> CMake [<a href="mailto:cmake-bounces@cmake.org" target="_blank">mailto:cmake-bounces@cmake.org</a>]
<b>On Behalf Of </b>Chris Johnson<br>
<b>Sent:</b> Wednesday, November 26, 2014 01:36<br>
<b>To:</b> <a href="mailto:cmake@cmake.org" target="_blank">cmake@cmake.org</a><br>
<b>Subject:</b> [CMake] Creating a library from subdirectories<u></u><u></u></span></p>
<p class="MsoNormal"><u></u> <u></u></p>
</span><div>
<div>
<p class="MsoNormal"><span style="font-family:"Courier New"">This CMake wiki page (<a href="http://www.cmake.org/Wiki/CMake/Tutorials/Object_Library" target="_blank">http://www.cmake.org/Wiki/CMake/Tutorials/Object_Library</a>) claims one can create a library
 from subdirectories containing libraries, which is exactly what I want to do.  However, it doesn't seem to work.  Here's my SSCCE (<a href="http://sscce.org" target="_blank">http://sscce.org</a>) "toy" example file structure:<u></u><u></u></span></p>
</div><div><div class="h5">
<div>
<p class="MsoNormal"><span style="font-family:"Courier New""><u></u> <u></u></span></p>
</div>
<div>
<div>
<p class="MsoNormal"><span style="font-family:"Courier New"">.<u></u><u></u></span></p>
</div>
<div>
<p class="MsoNormal"><span style="font-family:"Courier New"">|-- CMakeLists.txt<u></u><u></u></span></p>
</div>
<div>
<p class="MsoNormal"><span style="font-family:"Courier New"">|-- component1/<u></u><u></u></span></p>
</div>
<div>
<p class="MsoNormal"><span style="font-family:"Courier New"">|   |-- CMakeLists.txt<u></u><u></u></span></p>
</div>
<div>
<p class="MsoNormal"><span style="font-family:"Courier New"">|   `-- c1.c<u></u><u></u></span></p>
</div>
<div>
<p class="MsoNormal"><span style="font-family:"Courier New"">|-- component2/<u></u><u></u></span></p>
</div>
<div>
<p class="MsoNormal"><span style="font-family:"Courier New"">|   |-- CMakeLists.txt<u></u><u></u></span></p>
</div>
<div>
<p class="MsoNormal"><span style="font-family:"Courier New"">|   `-- c2.c<u></u><u></u></span></p>
</div>
<div>
<p class="MsoNormal"><span style="font-family:"Courier New"">`-- dummy.c<u></u><u></u></span></p>
</div>
<div>
<p class="MsoNormal"><span style="font-family:"Courier New""><u></u> <u></u></span></p>
</div>
<div>
<p class="MsoNormal"><span style="font-family:"Courier New""><u></u> <u></u></span></p>
</div>
<div>
<p class="MsoNormal"><span style="font-family:"Courier New"">## Here's the top level CMakeLists.txt, per example from Wiki:<u></u><u></u></span></p>
</div>
<div>
<p class="MsoNormal"><span style="font-family:"Courier New""><u></u> <u></u></span></p>
</div>
<div>
<div>
<p class="MsoNormal"><span style="font-family:"Courier New"">cmake_minimum_required(VERSION 2.8.4)<u></u><u></u></span></p>
</div>
<div>
<p class="MsoNormal"><span style="font-family:"Courier New"">project(lib)<u></u><u></u></span></p>
</div>
<div>
<p class="MsoNormal"><span style="font-family:"Courier New"">add_subdirectory(component1)<u></u><u></u></span></p>
</div>
<div>
<p class="MsoNormal"><span style="font-family:"Courier New"">add_subdirectory(component2)<u></u><u></u></span></p>
</div>
<div>
<p class="MsoNormal"><span style="font-family:"Courier New"">add_library(lib dummy.c)<u></u><u></u></span></p>
</div>
<div>
<p class="MsoNormal"><span style="font-family:"Courier New"">target_link_libraries(lib    component1 component2)<u></u><u></u></span></p>
</div>
<div>
<p class="MsoNormal"><span style="font-family:"Courier New""><u></u> <u></u></span></p>
</div>
<div>
<p class="MsoNormal"><span style="font-family:"Courier New"">## The subdirectory CMakeLists.txt files contain effectively just:<u></u><u></u></span></p>
</div>
<div>
<p class="MsoNormal"><span style="font-family:"Courier New"">add_library(component1  STATIC  c1.c) <u></u><u></u></span></p>
</div>
<div>
<p class="MsoNormal"><span style="font-family:"Courier New"">## and <u></u><u></u></span></p>
</div>
<div>
<p class="MsoNormal"><span style="font-family:"Courier New"">add_library(component2  STATIC  c2.c)<u></u><u></u></span></p>
</div>
<div>
<p class="MsoNormal"><span style="font-family:"Courier New""><u></u> <u></u></span></p>
</div>
<div>
<p class="MsoNormal"><span style="font-family:"Courier New""><u></u> <u></u></span></p>
</div>
<div>
<p class="MsoNormal"><span style="font-family:"Courier New"">## The resulting library file liblib.a contains only the dummy placeholder, but none of the subdirectory content:<u></u><u></u></span></p>
</div>
<div>
<p class="MsoNormal"><span style="font-family:"Courier New""><u></u> <u></u></span></p>
</div>
<div>
<div>
<p class="MsoNormal"><span style="font-family:"Courier New"">lib$ ar tv liblib.a<u></u><u></u></span></p>
</div>
<div>
<p class="MsoNormal"><span style="font-family:"Courier New""><u></u> <u></u></span></p>
</div>
<div>
<p class="MsoNormal"><span style="font-family:"Courier New"">rw-r--r--     502/20          696 Nov 25 18:23 2014 dummy.c.o<u></u><u></u></span></p>
</div>
<div>
<p class="MsoNormal"><span style="font-family:"Courier New""><u></u> <u></u></span></p>
</div>
<div>
<p class="MsoNormal"><span style="font-family:"Courier New""><u></u> <u></u></span></p>
</div>
</div>
<div>
<p class="MsoNormal"><span style="font-family:"Courier New"">## Is there some way to make this work?  <u></u><u></u></span></p>
</div>
<div>
<p class="MsoNormal"><span style="font-family:"Courier New""><u></u> <u></u></span></p>
</div>
<div>
<p class="MsoNormal"><span style="font-family:"Courier New"">* Ideally, I would not even need the dummy.c placeholder, but I can live with that.  <u></u><u></u></span></p>
</div>
<div>
<p class="MsoNormal"><span style="font-family:"Courier New""><u></u> <u></u></span></p>
</div>
<div>
<p class="MsoNormal"><span style="font-family:"Courier New"">* I do not want to list all of the source files in the top level CMakeLists.txt file.<u></u><u></u></span></p>
</div>
<div>
<p class="MsoNormal"><span style="font-family:"Courier New""><u></u> <u></u></span></p>
</div>
<div>
<p class="MsoNormal"><span style="font-family:"Courier New"">* I do not want to use the add_library(component1 OBJECT ${component1_sources}) and add_library(toplevel $<TARGET_OBJECTS:component1> ... ) syntax if it can be avoided.<u></u><u></u></span></p>
</div>
<div>
<p class="MsoNormal"><span style="font-family:"Courier New""><u></u> <u></u></span></p>
</div>
<div>
<p class="MsoNormal"><span style="font-family:"Courier New""><u></u> <u></u></span></p>
</div>
<div>
<p class="MsoNormal"><span style="font-family:"Courier New"">The reasons for my limitations is that to the greatest extent possible, I am generating CMakeLists.txt files via automation which needs to use a sort of a least-common-denominator approach to building
 those files.<u></u><u></u></span></p>
</div>
<div>
<p class="MsoNormal"><span style="font-family:"Courier New""><u></u> <u></u></span></p>
</div>
<div>
<p class="MsoNormal"><span style="font-family:"Courier New"">..chris<u></u><u></u></span></p>
</div>
</div>
</div>
</div></div></div>
</div>
</div>

</blockquote></div><br></div>