Hey everyone,

I posted a question on StackOverflow a while ago, but got no real answer
to my question there. I posted an answer there by myself, but this
solution does not work on every system. Since it also involves some
possible inconsistencies in the CMake documentation, I decided to ask
the question here as well.

Say I have packages A, B, and C. Package B uses package A and package C
uses package B. I create shared libraries.

So in package B I do something like

    find_package(A)
    ...
    if(${A_FOUND})
    target_link_libraries(B ${A_LIBRARIES})
    endif()

and in package C I do

    find_package(B)
    ...
    if(${B_FOUND})
    target_link_libraries(C ${B_LIBRARIES})
    endif()

    add_executable(main main.cpp)
    target_link_libraries(main C)

where ${B_LIBRARIES} contains only B. The compiler will now complain

    /usr/bin/ld: cannot find -lA
    collect2: error: ld returned 1 exit status

as long as A is installed in a place that is not in the default
directories. I was wondering what is the correct way of handling this.
For me using find_package(A) in C (which would work) doesn't seem to be
the nice. For me especially, because I don't know in advance if B
depends on A or not. It might also depend on a different package.

According to the documentation

https://cmake.org/cmake/help/v3.0/command/link_directories.html

"Library locations returned by find_package() and find_library() are
absolute paths.". This is true for system libraries like
/usr/lib/libmpi.so. However, this seems not to be true for most other
packages that I use. A reason for this might be that I use the
FooBarConfig.cmake file for finding the package (not a FindFooBar.cmake
file, since that's not always available). I myself create those
following this example:

https://cmake.org/Wiki/CMake/Tutorials/How_to_create_a_ProjectConfig.cmake_file

Here we have the line

set(FOOBAR_LIBRARIES foo)

which in the end will not use absolute paths. You can, however, use this
file for the find_package function, so according to the documentation it
should return absolute paths, which it apparently does not. So this
results in the error I described above when I compile C (where it links
to -lA instead of /custompath/A.so). So what is the correct way of
handling this?

Thanks in advance and best regards,
Sven
-- 

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

Reply via email to