<div dir="ltr">So I guess in order to include the object-files from a third party static library, the only way would be to first extract it's object-files and then combine them?<br></div><br><div class="gmail_quote"><div dir="ltr">On Fri, Sep 21, 2018 at 12:34 PM Deniz Bahadir <<a href="mailto:dbahadir@benocs.com">dbahadir@benocs.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Am 21.09.2018 um 18:38 schrieb Ke Gao:<br>
> Hi David,<br>
> <br>
> It didn't give me error info. It can produce the final static library, <br>
> but the contents of third party static libraries are not included.<br>
<br>
Some clarification regarding STATIC and OBJECT library targets and how <br>
they interact with each other using `target_link_libraries`:<br>
<br>
<br>
A STATIC library target A can be linked (via `target_link_libraries`) to <br>
another STATIC library target B.<br>
<br>
   `target_link_libraries(A STATIC PUBLIC B)`<br>
<br>
However, the resulting library file libB does not contain the <br>
information (aka object-files) of libA.<br>
Instead, CMake makes sure to link both static library files libB and <br>
libA when e.g. creating an executable exeC1 using target C1 which just <br>
links (via `target_link_libraries`) to target B.<br>
<br>
   `target_link_libraries(C1 EXECUTABLE PUBLIC B)`<br>
<br>
(Instead of an executable exeC1 you could have created a shared library <br>
libC1 instead. The behavior is the same.)<br>
<br>
<br>
If you instead want to create a combined, single STATIC library libC2, <br>
which contains the object-files archived in both static library files <br>
libA and libB created from targets A and B, then you somehow need to <br>
extract the archived object-files from libA and libB. I am not sure if <br>
CMake provides a (simple) way to do this.<br>
<br>
<br>
<br>
For OBJECT libraries the behavior is like this:<br>
<br>
<br>
An OBJECT library target X can be linked (via `target_link_libraries`) <br>
to another OBJECT library target Y.<br>
<br>
   `target_link_libraries(Y OBJECT PUBLIC X)`<br>
<br>
This, however, only transports the usage-requirements <br>
(preprocessor-defines, include-paths etc.) from X to Y. The object-files <br>
of X are in no way referenced by Y.<br>
<br>
So, if you then create a STATIC target Z1 that links (via <br>
`target_link_libraries`) to Y,...<br>
<br>
   `target_link_libraries(Z1 STATIC PUBLIC Y)`<br>
<br>
... Z1 will reference/contain the usage-requirements of X and Y and the <br>
object-files of Y, but not the object-files of X. (The static library <br>
file libZ1 resulting from Z1 will contain the object-libraries of Y but <br>
not of X.)<br>
<br>
<br>
What you should do instead is not to link the OBJECT targets X and Y <br>
together but instead only link them (explicitly) to the STATIC target Z2:<br>
<br>
   `target_link_libraries(Z2 STATIC PUBLIC Y X)`<br>
<br>
Z2 then references the usage-requirements as-well-as object-files of <br>
both OBJECT targets X and Y and the resulting static library file libZ2 <br>
will then contain the object-files of both library targets, X and Y.<br>
<br>
<br>
> <br>
> Also, sorry for the mistake I have made in my previous email. Deniz is <br>
> right, the keyword "PUBLIC" should be used in target_link_librarie().<br>
> <br>
> Thanks<br>
<br>
You're welcome.<br>
<br>
Deniz<br>
<br>
<br>
> <br>
> On Fri, Sep 21, 2018 at 10:06 AM David Jobet <<a href="mailto:djobet@tower-research.com" target="_blank">djobet@tower-research.com</a> <br>
> <mailto:<a href="mailto:djobet@tower-research.com" target="_blank">djobet@tower-research.com</a>>> wrote:<br>
> <br>
>     Hello,<br>
> <br>
>     glad that could help you.<br>
>     For your newer problem, you don't describe them, so it's tough to know<br>
>     what kind of problems you're facing.<br>
>     Maybe a small example of your CMakeLists.txt + a capture of the error<br>
>     cmake gives you could help ?<br>
> <br>
>     David<br>
>     On Fri, Sep 21, 2018 at 4:52 PM Ke Gao <<a href="mailto:ke.gao.ut@gmail.com" target="_blank">ke.gao.ut@gmail.com</a><br>
>     <mailto:<a href="mailto:ke.gao.ut@gmail.com" target="_blank">ke.gao.ut@gmail.com</a>>> wrote:<br>
>      ><br>
>      > Thank you all for the help.<br>
>      ><br>
>      > I finally use a way quite similar to David's first approach. I<br>
>     first generate all sub-projects into object libraries using<br>
>     add_library(lib1 OBJECT SOURCES). Then in the final library, I use<br>
>     add_library(single_static_lib STATIC SOURCES) and<br>
>     target_link_libraries( single_static_lib lib1 lib2 ...). Note that I<br>
>     didn't use " $<TARGET_OBJECTS:lib1>" in the final "add_library" and<br>
>     also didn't use "PUBLIC" keyword in the final<br>
>     "target_link_libraries". It works on CMake v3.12.2 and gives me a<br>
>     single static lib which combines all the objs I want.<br>
>      ><br>
>      > But currently I still have problems of further combining third<br>
>     party static libraries into the final generated static<br>
>     single_static_lib. Can anybody provide a solution for this?<br>
>      ><br>
>      > Thank you very much.<br>
>      ><br>
>      > Ke<br>
>      ><br>
>      > On Fri, Sep 21, 2018 at 6:15 AM Deniz Bahadir<br>
>     <<a href="mailto:dbahadir@benocs.com" target="_blank">dbahadir@benocs.com</a> <mailto:<a href="mailto:dbahadir@benocs.com" target="_blank">dbahadir@benocs.com</a>>> wrote:<br>
>      >><br>
>      >> Am 21.09.2018 um 09:33 schrieb David Jobet:<br>
>      >> > Hello,<br>
>      >> ><br>
>      >> > I had a similar issue lately and wanted to "pack" several<br>
>     static libs<br>
>      >> > into a dynamic one. (Not even talking about an INTERFACE lib<br>
>     since I<br>
>      >> > really wanted that .so)<br>
>      >> > I made it work with 3 different solutions, none of them being<br>
>     "clean"<br>
>      >> > from my point of view.<br>
>      >> ><br>
>      >> > 1- OBJECT libs on sub projects : add_library(lib1 OBJECT<br>
>     SOURCES) and<br>
>      >> > for the single static lib : add_library(single_static_lib STATIC<br>
>      >> > $<TARGET_OBJECTS:lib1> ...)<br>
>      >> > Problem I faced : since OBJECT libs do not support<br>
>      >> > target_link_libraries(), I had to remove the existing one and move<br>
>      >> > them instead to the target_include_directories() using generators.<br>
>      >><br>
>      >> This is no longer true. Since CMake 3.12 `target_link_libraries`<br>
>     fully<br>
>      >> supports OBJECT libraries. You just need to pay attention to the<br>
>     special<br>
>      >> case of linking an OBJECT library with keyword "PUBLIC".<br>
>     (Object-files<br>
>      >> are always private and inherited object-files are therefore never<br>
>      >> further inherited. See:<br>
>      >><br>
>     <a href="https://cmake.org/cmake/help/v3.12/command/target_link_libraries.html#linking-object-libraries" rel="noreferrer" target="_blank">https://cmake.org/cmake/help/v3.12/command/target_link_libraries.html#linking-object-libraries</a>)<br>
>      >><br>
>      >> > e.g : target_include_directories(lib1 PUBLIC<br>
>      >> > $<TARGET_PROPERTY:another_lib,INCLUDE_DIRECTORIES>)<br>
>      >> > Because I had a dependency to a protobuf generated lib, I also<br>
>     had to<br>
>      >> > add manual add_dependencies to respect proper build order.<br>
>      >> > Not clean at all<br>
>      >> ><br>
>      >> > 2- add_library(mysharedlib STATIC CMakeLists.txt)<br>
>      >> > target_linked_libraries(mysharedlib PUBLIC lib1 ...)<br>
>      >> > Maybe the cleanest way I found.<br>
>      >> > The trick with CMakeLists.txt is that add_library needs at<br>
>     least one<br>
>      >> > source file. You can put any kind of files you want.<br>
>     CMakeLists.txt is<br>
>      >> > not compilable, so no extra compilation step, no need for<br>
>     dummy empty<br>
>      >> > source file and add_library is happy.<br>
>      >> > It did not work in my case because of problems related to how<br>
>     our .so<br>
>      >> > are used/generated. (problems at runtime with duplicated<br>
>     symbols in<br>
>      >> > protobufs)<br>
>      >> ><br>
>      >> > 3- a variation around 1<br>
>      >> > instead of defining OBJECT libs, define a variable holding all the<br>
>      >> > sources for lib1, another for lib2, ...<br>
>      >> > then just do add_library(mysharedlib STATIC ${SOURCES_FOR_lib1}<br>
>      >> > ${SOURCES_FOR_lib2})<br>
>      >> > It works a little bit like 1) but does not have any of its<br>
>     problems<br>
>      >> > (target_link, add_dependencies, generators, ...)<br>
>      >> > It has new problems of its own though : if your libs live in<br>
>     different<br>
>      >> > subfolders, the variables might not be visible from your<br>
>      >> > add_library(mysharedlib...) call.<br>
>      >> > To work around that, you can use PARENT_SCOPE (not sure if<br>
>     that works<br>
>      >> > accross several levels), or includes (defines those variables into<br>
>      >> > separate files living in each subfolders and include them in the<br>
>      >> > parent CMakeLists).<br>
>      >> ><br>
>      >> > Hope this helps (and I'd be happy to know of other ways)<br>
>      >> ><br>
>      >> > David<br>
>      >> > On Thu, Sep 20, 2018 at 5:45 PM Ke Gao <<a href="mailto:ke.gao.ut@gmail.com" target="_blank">ke.gao.ut@gmail.com</a><br>
>     <mailto:<a href="mailto:ke.gao.ut@gmail.com" target="_blank">ke.gao.ut@gmail.com</a>>> wrote:<br>
>      >> >><br>
>      >> >> Hi,<br>
>      >> >><br>
>      >> >> I have a project which includes many sub-projects. Each<br>
>     sub-project generates a static library. In the main project, I want<br>
>     to combine the generated objs, generated static libraries from other<br>
>     sub-projects, and some other third party static libraries together<br>
>     into a single static library. Is there an elegant way to do this, or<br>
>     maybe an existing function?<br>
>      >> >><br>
>      >> >> Thank you very much.<br>
>      >> >><br>
>      >> >> --<br>
>      >> >><br>
>     ..............................................................................................................................................<br>
>      >> >> Ke Gao<br>
>      >><br>
>      >><br>
>      >> Hope that information was of value,<br>
>      >> Deniz<br>
>      >><br>
>      >> --<br>
>      >><br>
>      >> Powered by <a href="http://www.kitware.com" rel="noreferrer" target="_blank">www.kitware.com</a> <<a href="http://www.kitware.com" rel="noreferrer" target="_blank">http://www.kitware.com</a>><br>
>      >><br>
>      >> Please keep messages on-topic and check the CMake FAQ at:<br>
>     <a href="http://www.cmake.org/Wiki/CMake_FAQ" rel="noreferrer" target="_blank">http://www.cmake.org/Wiki/CMake_FAQ</a><br>
>      >><br>
>      >> Kitware offers various services to support the CMake community.<br>
>     For more information on each offering, please visit:<br>
>      >><br>
>      >> CMake Support: <a href="http://cmake.org/cmake/help/support.html" rel="noreferrer" target="_blank">http://cmake.org/cmake/help/support.html</a><br>
>      >> CMake Consulting: <a href="http://cmake.org/cmake/help/consulting.html" rel="noreferrer" target="_blank">http://cmake.org/cmake/help/consulting.html</a><br>
>      >> CMake Training Courses: <a href="http://cmake.org/cmake/help/training.html" rel="noreferrer" target="_blank">http://cmake.org/cmake/help/training.html</a><br>
>      >><br>
>      >> Visit other Kitware open-source projects at<br>
>     <a href="http://www.kitware.com/opensource/opensource.html" rel="noreferrer" target="_blank">http://www.kitware.com/opensource/opensource.html</a><br>
>      >><br>
>      >> Follow this link to subscribe/unsubscribe:<br>
>      >> <a href="https://cmake.org/mailman/listinfo/cmake" rel="noreferrer" target="_blank">https://cmake.org/mailman/listinfo/cmake</a><br>
>      ><br>
>      ><br>
>      ><br>
>      > --<br>
>      ><br>
>     ..............................................................................................................................................<br>
>      > Ke Gao<br>
>     -- <br>
> <br>
>     Powered by <a href="http://www.kitware.com" rel="noreferrer" target="_blank">www.kitware.com</a> <<a href="http://www.kitware.com" rel="noreferrer" target="_blank">http://www.kitware.com</a>><br>
> <br>
>     Please keep messages on-topic and check the CMake FAQ at:<br>
>     <a href="http://www.cmake.org/Wiki/CMake_FAQ" rel="noreferrer" target="_blank">http://www.cmake.org/Wiki/CMake_FAQ</a><br>
> <br>
>     Kitware offers various services to support the CMake community. For<br>
>     more information on each offering, please visit:<br>
> <br>
>     CMake Support: <a href="http://cmake.org/cmake/help/support.html" rel="noreferrer" target="_blank">http://cmake.org/cmake/help/support.html</a><br>
>     CMake Consulting: <a href="http://cmake.org/cmake/help/consulting.html" rel="noreferrer" target="_blank">http://cmake.org/cmake/help/consulting.html</a><br>
>     CMake Training Courses: <a href="http://cmake.org/cmake/help/training.html" rel="noreferrer" target="_blank">http://cmake.org/cmake/help/training.html</a><br>
> <br>
>     Visit other Kitware open-source projects at<br>
>     <a href="http://www.kitware.com/opensource/opensource.html" rel="noreferrer" target="_blank">http://www.kitware.com/opensource/opensource.html</a><br>
> <br>
>     Follow this link to subscribe/unsubscribe:<br>
>     <a href="https://cmake.org/mailman/listinfo/cmake" rel="noreferrer" target="_blank">https://cmake.org/mailman/listinfo/cmake</a><br>
> <br>
> <br>
> <br>
> -- <br>
> ..............................................................................................................................................<br>
> Ke Gao<br>
> <br>
> <br>
-- <br>
<br>
Powered by <a href="http://www.kitware.com" rel="noreferrer" target="_blank">www.kitware.com</a><br>
<br>
Please keep messages on-topic and check the CMake FAQ at: <a href="http://www.cmake.org/Wiki/CMake_FAQ" rel="noreferrer" target="_blank">http://www.cmake.org/Wiki/CMake_FAQ</a><br>
<br>
Kitware offers various services to support the CMake community. For more information on each offering, please visit:<br>
<br>
CMake Support: <a href="http://cmake.org/cmake/help/support.html" rel="noreferrer" target="_blank">http://cmake.org/cmake/help/support.html</a><br>
CMake Consulting: <a href="http://cmake.org/cmake/help/consulting.html" rel="noreferrer" target="_blank">http://cmake.org/cmake/help/consulting.html</a><br>
CMake Training Courses: <a href="http://cmake.org/cmake/help/training.html" rel="noreferrer" target="_blank">http://cmake.org/cmake/help/training.html</a><br>
<br>
Visit other Kitware open-source projects at <a href="http://www.kitware.com/opensource/opensource.html" rel="noreferrer" target="_blank">http://www.kitware.com/opensource/opensource.html</a><br>
<br>
Follow this link to subscribe/unsubscribe:<br>
<a href="https://cmake.org/mailman/listinfo/cmake" rel="noreferrer" target="_blank">https://cmake.org/mailman/listinfo/cmake</a><br>
</blockquote></div><br clear="all"><br>-- <br><div dir="ltr" class="gmail_signature" data-smartmail="gmail_signature"><div dir="ltr"><div><div dir="ltr"><div dir="ltr"><div dir="ltr"><div><font color="#000000" face="arial,helvetica,sans-serif" size="1">..............................................................................................................................................</font></div><font color="#3366ff" face="tahoma,sans-serif"><div><font color="#000000" face="arial black,sans-serif" style="background-color:rgb(255,255,255)">Ke Gao</font></div></font></div></div></div></div></div></div>