[CMake] Link order (Ubuntu)

Giorgio Scorzelli scrgiorgio at gmail.com
Wed Nov 7 22:26:46 EST 2018


I finally found this hack:

  target_link_libraries(MyExe B $<TARGET_FILE:A> ImpLib)

so I'm forcing the 'A' dependency to appear before the ImpLib.
Note that if I use:

  target_link_libraries(MyExe B A ImpLib)

it does not work. I think it's because Cmake it's internally  erasing
unnecessary dependencies.

Hope it helps other developers.


Il giorno mer 7 nov 2018 alle ore 19:10 Bo Zhou <bo.schwarzstein at gmail.com>
ha scritto:

> Oh, if that's shared libraries, maybe you have to setup the
> LD_LIBRARY_PATH well for the shared libraries before linking, it just
> allows the linker to be able to locate the all necessary dynamic libraries
> during the linking. It happens sometimes on Linux, but not exists on OSX
> and Windows.
>
> On Tue, Nov 6, 2018 at 11:19 PM Giorgio Scorzelli <scrgiorgio at gmail.com>
> wrote:
>
>> Thanks for you help.
>>
>> They are really shared lib, not static. I know it sounds weird: it's a
>> python extension which must not link the ${PYTHON_LIBRARY}  (according to
>> official docs; in fact If I do so I get a segmentation fault) but finally
>> in my executable,a sort of custom/home made  ${PYTHON_EXECUTABLE}, I have
>> to link the ${PYTHON_LIBRARY}.
>>
>> About the "B;A;ImportedExtLib;B;A" order. I agree too: it SHOULD work.
>> Let's say I do:
>>
>> target_link_libraries(MyExe B A ImpLib)
>>
>> in command line (make VERBOSE=1) I;m getting
>>
>> g++ .... -o MyExe B A ImpLib A
>>
>> The last "A" is coming from target_link_libraries(B PUBLIC A) and the
>> linker  is complaining that this last "A" has undefined symbols.
>>
>> Thanks.Giorgio.
>>
>>
>>
>>
>>
>>
>>
>>
>> Il giorno mar 6 nov 2018 alle ore 06:59 Robert Maynard <
>> robert.maynard at kitware.com> ha scritto:
>>
>>> You have order dependent static libraries which can be solved by
>>> constructing a cycle. As Bo stated by constructing the cycle
>>> B;A;ImportedExtLib;B;A each library can see each other.
>>>
>>> Looking at your original code example it looks like you are importing
>>> the libraries as SHARED, but I think these are actually static
>>> libraries and should be imported as such so that CMake does the
>>> automatic cycle creation. In general CMake doesn't do cycle creation
>>> for shared libraries as they are not link order dependent.
>>> On Tue, Nov 6, 2018 at 8:51 AM Giorgio Scorzelli <scrgiorgio at gmail.com>
>>> wrote:
>>> >
>>> > I read the docs about  LINK_INTERFACE_MULTIPLICITY    too.
>>> > But I'm not in the situation of a "cyclic dependency" so I 'm not sure
>>> if it solve my problem.
>>> > In my case (with B A and ImpLib) what would be the syntax?
>>> >
>>> > Il giorno mar 6 nov 2018 alle ore 06:30 Robert Maynard <
>>> robert.maynard at kitware.com> ha scritto:
>>> >>
>>> >> The target_link_libraries has a property called
>>> >> LINK_INTERFACE_MULTIPLICITY that should help you out.
>>> >>
>>> https://cmake.org/cmake/help/v3.13/command/target_link_libraries.html#cyclic-dependencies-of-static-libraries
>>> >>
>>> >>
>>> >> On Tue, Nov 6, 2018 at 8:24 AM scrgiorgio <scrgiorgio at gmail.com>
>>> wrote:
>>> >> >
>>> >> > Thanks for the help,
>>> >> >
>>> >> > trying this (or any combination):
>>> >> >
>>> >> > target_link_libraries(MyExe B)
>>> >> > target_link_libraries(MyExe A )
>>> >> > target_link_libraries(MyExe ImpLib)
>>> >> >
>>> >> > I get this order:
>>> >> >
>>> >> > 'B;...whatever...;A;ImpLib"
>>> >> >
>>> >> > and the last past is causing the problem. Apparently there is no
>>> way to
>>> >> > change the right part (-Wl,--start-group -Wl,--end-groun sometimes
>>> work,
>>> >> > sometimes not).
>>> >> > Any advice?
>>> >> >
>>> >> >
>>> >> >
>>> >> >
>>> >> > --
>>> >> > Sent from: http://cmake.3232098.n2.nabble.com/
>>> >> > --
>>> >> >
>>> >> > 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
>>>
>> --
>>
>> 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
>>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://cmake.org/pipermail/cmake/attachments/20181107/86ffb026/attachment-0001.html>


More information about the CMake mailing list