[CMake] OBJECT libraries and INTERFACE_SOURCES

Chuck Atkins chuck.atkins at kitware.com
Fri Dec 9 11:17:02 EST 2016


Hi Giovanni,
Does it work if you add lib1 as a private dependency of lib2?  i.e.:
target_link_libraries(lib2 PRIVATE lib1)

Also, it shouldn't matter but what about in your original example if you
use the full path to the source file instead while still keeping the public
link dependency?  i.e.:
add_library(lib1-obj OBJECT $(CMAKE_CURRENT_SOURCE_DIR}/lib1.cpp).

----------
Chuck Atkins
Staff R&D Engineer, Scientific Computing
Kitware, Inc.


On Fri, Dec 9, 2016 at 5:26 AM, Giovanni Funchal <gio at cloudnc.co.uk> wrote:

> Hi,
>
> Apologies, the problem wasn't properly minimised because I had some
> trouble wrapping my head around it. Here's two complete examples which I
> hope can explain the problem better this time.
>
> 1) This works:
>
> [CMakeLists.txt]
>     cmake_minimum_required(VERSION 3.6)
>     project(Test)
>     add_library(lib1-obj OBJECT lib1.cpp)
>     add_library(lib1 INTERFACE)
>     set_target_properties(lib1 PROPERTIES INTERFACE_SOURCES
> $<TARGET_OBJECTS:lib1-obj>)
>     add_library(lib2 lib2.cpp)
>     target_link_libraries(lib2 lib1)
>     add_executable(main main.cpp)
>     target_link_libraries(main lib2)
>
> 2) But this does not:
>
> [CMakeLists.txt]
>     cmake_minimum_required(VERSION 3.6)
>     project(Test)
>     add_library(lib1-obj OBJECT lib1.cpp)
>     add_library(lib1 INTERFACE)
>     set_target_properties(lib1 PROPERTIES INTERFACE_SOURCES
> $<TARGET_OBJECTS:lib1-obj>)
>     add_library(lib2 lib2.cpp)
>     target_link_libraries(lib2 lib1)
>     add_subdirectory(main)
>
> [main/CMakeLists.txt]
>     add_executable(main main.cpp)
>     target_link_libraries(main lib2)
>
> With the second example, I get an error "cannot find source file
> lib1.cpp.o tried extensions...".
>
> Thanks,
> -- Giovanni
>
>
> On Thu, Dec 8, 2016 at 9:56 PM, Stephen Kelly <steveire at gmail.com> wrote:
>
>> Giovanni Funchal wrote:
>>
>> > Hi,
>> >
>> > The help page [1] mentions that:
>> >
>> >> Although object libraries may not be named directly in calls to the
>> >> target_link_libraries() command, they can be “linked” indirectly by
>> >> using an Interface Library whose INTERFACE_SOURCES target property
>> >> is set to name $<TARGET_OBJECTS:objlib>.
>> >
>> > However, I was unable to get this to work. Doing this:
>> >
>> > add_library(lib-obj OBJECT test.cpp)
>> > add_library(lib INTERFACE)
>> > add_dependencies(lib lib-obj)
>> > set_target_properties(lib PROPERTIES INTERFACE_SOURCES
>> > $<TARGET_OBJECTS:lib-obj>)
>> >
>> > And then trying to specify lib in link_libraries of an executable yields
>> > an error message "Cannot find source file: ... Tried extensions:... ".
>> >
>> > Am I doing something wrong?
>>
>> This works for me:
>>
>>     cmake_minimum_required(VERSION 3.3)
>>
>>     project(testit CXX)
>>
>>     add_library(lib-obj OBJECT foo.cpp)
>>     add_library(lib-iface INTERFACE)
>>     set_target_properties(lib-iface PROPERTIES
>>       INTERFACE_SOURCES $<TARGET_OBJECTS:lib-obj>
>>     )
>>     add_executable(main foo-user.cpp)
>>     target_link_libraries(main lib-iface)
>>
>>
>> Thanks,
>>
>> Steve.
>>
>>
>> --
>>
>> 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:
>> http://public.kitware.com/mailman/listinfo/cmake
>
>
>
> --
>
> 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/opensou
> rce/opensource.html
>
> Follow this link to subscribe/unsubscribe:
> http://public.kitware.com/mailman/listinfo/cmake
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://public.kitware.com/pipermail/cmake/attachments/20161209/ed44cca6/attachment-0001.html>


More information about the CMake mailing list