Hi David, It didn't give me error info. It can produce the final static library, but the contents of third party static libraries are not included.
Also, sorry for the mistake I have made in my previous email. Deniz is right, the keyword "PUBLIC" should be used in target_link_librarie(). Thanks On Fri, Sep 21, 2018 at 10:06 AM David Jobet <djo...@tower-research.com> wrote: > Hello, > > glad that could help you. > For your newer problem, you don't describe them, so it's tough to know > what kind of problems you're facing. > Maybe a small example of your CMakeLists.txt + a capture of the error > cmake gives you could help ? > > David > On Fri, Sep 21, 2018 at 4:52 PM Ke Gao <ke.gao...@gmail.com> wrote: > > > > Thank you all for the help. > > > > I finally use a way quite similar to David's first approach. I first > generate all sub-projects into object libraries using add_library(lib1 > OBJECT SOURCES). Then in the final library, I use > add_library(single_static_lib STATIC SOURCES) and target_link_libraries( > single_static_lib lib1 lib2 ...). Note that I didn't use " > $<TARGET_OBJECTS:lib1>" in the final "add_library" and also didn't use > "PUBLIC" keyword in the final "target_link_libraries". It works on CMake > v3.12.2 and gives me a single static lib which combines all the objs I want. > > > > But currently I still have problems of further combining third party > static libraries into the final generated static single_static_lib. Can > anybody provide a solution for this? > > > > Thank you very much. > > > > Ke > > > > On Fri, Sep 21, 2018 at 6:15 AM Deniz Bahadir <dbaha...@benocs.com> > wrote: > >> > >> Am 21.09.2018 um 09:33 schrieb David Jobet: > >> > Hello, > >> > > >> > I had a similar issue lately and wanted to "pack" several static libs > >> > into a dynamic one. (Not even talking about an INTERFACE lib since I > >> > really wanted that .so) > >> > I made it work with 3 different solutions, none of them being "clean" > >> > from my point of view. > >> > > >> > 1- OBJECT libs on sub projects : add_library(lib1 OBJECT SOURCES) and > >> > for the single static lib : add_library(single_static_lib STATIC > >> > $<TARGET_OBJECTS:lib1> ...) > >> > Problem I faced : since OBJECT libs do not support > >> > target_link_libraries(), I had to remove the existing one and move > >> > them instead to the target_include_directories() using generators. > >> > >> This is no longer true. Since CMake 3.12 `target_link_libraries` fully > >> supports OBJECT libraries. You just need to pay attention to the special > >> case of linking an OBJECT library with keyword "PUBLIC". (Object-files > >> are always private and inherited object-files are therefore never > >> further inherited. See: > >> > https://cmake.org/cmake/help/v3.12/command/target_link_libraries.html#linking-object-libraries > ) > >> > >> > e.g : target_include_directories(lib1 PUBLIC > >> > $<TARGET_PROPERTY:another_lib,INCLUDE_DIRECTORIES>) > >> > Because I had a dependency to a protobuf generated lib, I also had to > >> > add manual add_dependencies to respect proper build order. > >> > Not clean at all > >> > > >> > 2- add_library(mysharedlib STATIC CMakeLists.txt) > >> > target_linked_libraries(mysharedlib PUBLIC lib1 ...) > >> > Maybe the cleanest way I found. > >> > The trick with CMakeLists.txt is that add_library needs at least one > >> > source file. You can put any kind of files you want. CMakeLists.txt is > >> > not compilable, so no extra compilation step, no need for dummy empty > >> > source file and add_library is happy. > >> > It did not work in my case because of problems related to how our .so > >> > are used/generated. (problems at runtime with duplicated symbols in > >> > protobufs) > >> > > >> > 3- a variation around 1 > >> > instead of defining OBJECT libs, define a variable holding all the > >> > sources for lib1, another for lib2, ... > >> > then just do add_library(mysharedlib STATIC ${SOURCES_FOR_lib1} > >> > ${SOURCES_FOR_lib2}) > >> > It works a little bit like 1) but does not have any of its problems > >> > (target_link, add_dependencies, generators, ...) > >> > It has new problems of its own though : if your libs live in different > >> > subfolders, the variables might not be visible from your > >> > add_library(mysharedlib...) call. > >> > To work around that, you can use PARENT_SCOPE (not sure if that works > >> > accross several levels), or includes (defines those variables into > >> > separate files living in each subfolders and include them in the > >> > parent CMakeLists). > >> > > >> > Hope this helps (and I'd be happy to know of other ways) > >> > > >> > David > >> > On Thu, Sep 20, 2018 at 5:45 PM Ke Gao <ke.gao...@gmail.com> wrote: > >> >> > >> >> Hi, > >> >> > >> >> I have a project which includes many sub-projects. Each sub-project > generates a static library. In the main project, I want to combine the > generated objs, generated static libraries from other sub-projects, and > some other third party static libraries together into a single static > library. Is there an elegant way to do this, or maybe an existing function? > >> >> > >> >> Thank you very much. > >> >> > >> >> -- > >> >> > .............................................................................................................................................. > >> >> Ke Gao > >> > >> > >> Hope that information was of value, > >> Deniz > >> > >> -- > >> > >> Powered by www.kitware.com > >> > >> Please keep messages on-topic and check the CMake FAQ at: > http://www.cmake.org/Wiki/CMake_FAQ > >> > >> Kitware offers various services to support the CMake community. For > more information on each offering, please visit: > >> > >> CMake Support: http://cmake.org/cmake/help/support.html > >> CMake Consulting: http://cmake.org/cmake/help/consulting.html > >> CMake Training Courses: http://cmake.org/cmake/help/training.html > >> > >> Visit other Kitware open-source projects at > http://www.kitware.com/opensource/opensource.html > >> > >> Follow this link to subscribe/unsubscribe: > >> https://cmake.org/mailman/listinfo/cmake > > > > > > > > -- > > > .............................................................................................................................................. > > Ke Gao > -- > > Powered by www.kitware.com > > Please keep messages on-topic and check the CMake FAQ at: > http://www.cmake.org/Wiki/CMake_FAQ > > Kitware offers various services to support the CMake community. For more > information on each offering, please visit: > > CMake Support: http://cmake.org/cmake/help/support.html > CMake Consulting: http://cmake.org/cmake/help/consulting.html > CMake Training Courses: http://cmake.org/cmake/help/training.html > > Visit other Kitware open-source projects at > http://www.kitware.com/opensource/opensource.html > > Follow this link to subscribe/unsubscribe: > https://cmake.org/mailman/listinfo/cmake > -- .............................................................................................................................................. Ke Gao
-- Powered by www.kitware.com Please keep messages on-topic and check the CMake FAQ at: http://www.cmake.org/Wiki/CMake_FAQ Kitware offers various services to support the CMake community. For more information on each offering, please visit: CMake Support: http://cmake.org/cmake/help/support.html CMake Consulting: http://cmake.org/cmake/help/consulting.html CMake Training Courses: http://cmake.org/cmake/help/training.html Visit other Kitware open-source projects at http://www.kitware.com/opensource/opensource.html Follow this link to subscribe/unsubscribe: https://cmake.org/mailman/listinfo/cmake