I have a situation where I create a number of static libraries, then I
create a shared library from them, then I create an executable from the
shared library.
This seems straightforward, but I can't get it do work as I want. The
behavior of STATIC -> SHARED for target property inheritance seems
incorrect to me.
I'm using CMake 3.14.5 on GNU/Linux for this test.
I need the compile properties of the static library (include
directories etc.) to be public for all users of the shared library as
well. But obviously I don't want users of the shared library to also
link the static library!! That defeats the whole purpose of the shared
library.
If I set up like this:
$ touch foo.c bar.c
$ echo 'int main() { return 0; }' > run.c
then write my CMakeFiles.txt like this:
cmake_minimum_required(VERSION 3.13)
project(Test C)
add_library(foo STATIC foo.c)
target_include_directories(foo PUBLIC /tmp)
add_library(bar SHARED bar.c)
target_link_libraries(bar PUBLIC foo)
add_executable(run run.c)
target_link_libraries(run PUBLIC bar)
Then, I DO get the -I/tmp forwarded up to run.c:
cc -I/tmp -o CMakeFiles/run.dir/run.c.o -c run.c
^^^^^^
But libfoo.a is ALSO added to my link line, which is really wrong!
cc CMakeFiles/run.dir/run.c.o -o run -Wl,-rpath,. libbar.so libfoo.a
^^^^^^^^
On the other hand if I change the link of foo to be PRIVATE instead of
PUBLIC:
target_link_libraries(bar PRIVATE foo)
then the link doesn't include libfoo.a, which is good, but I also don't
have the -I/tmp when I compile run.c, which is wrong:
cc -o CMakeFiles/run.dir/run.c.o -c run.c
cc CMakeFiles/run.dir/run.c.o -o run -Wl,-rpath,. libbar.so
Does this seem wrong to anyone else? Is there some trick to it?
Or do I have to resort to by-hand forwarding of build properties rather
than relying on a straightforward target_link_libraries() line?
--
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