On 05/24/2010 11:20 AM, Jesper Eskilson wrote:
> Hi,
> 
> I have two targets, call them A and B. They both link with a third, 
> static library called C. C attempts to invoke a function which is 
> defined by however links with C, i.e. either A or B.
> 
> This is not a problem as long as A and B are executables or shared 
> libraries, but if A or B is a static library which in turn is linked 
> into a shared object or executable (call it D), then the command becomes 
> something like
> 
>      cc ... -o libD.so -lA -lC
> 
> since the method C calls in A is unknown by the linker when A is 
> processed, it is discarded. Instead, I would need the command line to 
> look like this:
> 
>      cc ... -o libD.so -lA -lC -lA
> 
> but how can I do this without explicitly causing A to depend on C?

According to your first paragraph, A does depend on C; what you're
asking for is a, say, optional dependency of C on A, right? How do
you decide whether to use A or B? If this is known at CMake time:

TARGET_LINK_LIBRARIES(A C)
TARGET_LINK_LIBRARIES(C A)
TARGET_LINK_LIBRARIES(D A)

should do the job for A, and

TARGET_LINK_LIBRARIES(B C)
TARGET_LINK_LIBRARIES(C B)
TARGET_LINK_LIBRARIES(D B)

does it for B, alternatively, since TARGET_LINK_LIBRARIES() attends to
circular dependencies w.r.t. static libraries, see its documentation.
Furthermore, I suppose you can't use A and B together due to equally
named symbols defined in both of them, in fact the ones called by C.

In the last resort, the GNU linker provides options "--start-group" and
"--end-group", or the short ones "-(" and "-)", respectively, meant to
resolve circular dependencies among static libraries, but I don't know
if one can have CMake intersperse these options in the link line or if
this would be portable regarding the various supported platforms.

Perhaps, if possible, you should consider to reorganize your project in
order to avoid circular dependencies at all, e.g.: Take those parts of
A and B that C refers to and turn them into separate libraries A0 and
B0. This results in A, B and C depend on A0 and/or B0, and the link
line for libD.so would be:

"cc ... -o libD.so -lA -lC -lA0" or "cc ... -o libD.so -lB -lC -lB0"

Thus, the circular dependencies are gone.

Regards,

Michael
_______________________________________________
Powered by www.kitware.com

Visit other Kitware open-source projects at 
http://www.kitware.com/opensource/opensource.html

Please keep messages on-topic and check the CMake FAQ at: 
http://www.cmake.org/Wiki/CMake_FAQ

Follow this link to subscribe/unsubscribe:
http://www.cmake.org/mailman/listinfo/cmake

Reply via email to