Hi,
Thanks for the suggestion about OBJECT libraries, I've learnt one more way to 
design my build process.
Nevertheless, the effect also appears when linking dynamic libraries. For 
example, a slightly modified CMakeLists.txt:

cmake_minimum_required(VERSION 3.5)

file(WRITE a.cpp "")
file(WRITE b.cpp "")
file(WRITE lib.cpp "")
file(WRITE main.cpp "int main(){return 0;}")

add_library(A SHARED a.cpp)
add_library(B SHARED b.cpp)

add_library(L SHARED lib.cpp)

target_link_libraries(L
    -Wl,-as-needed A -Wl,-no-as-needed
    -Wl,-as-needed B -Wl,-no-as-needed
)

add_executable(main main.cpp)
target_link_libraries(main L)
In this example, I only want libA and libB linked into the main executable iff 
their symbols are used somewhere in the linking chain (-as-needed). However, 
libB appears as a needed library because the -Wl,-as-needed flag has no effect 
on it (it's not in front of libB in CMakeFiles/main.dir/link.txt)

$> objdump -p main | grep NEEDED
    ...
    NEEDED               libL.so
    NEEDED               libB.so
    ...

Furthermore, if I link 'main' manually from the command line, then 'main' 
doesn't link libB anymore:

$> g++ -o main ../main.cpp -lL -L.
$> objdump -p main | grep NEEDED
    ...
    NEEDED               libL.so
    ...


The reason why I think it's a bug is that the linkage behaves differently 
between cmake and raw command line, due to some conflicts between flags when 
constructing the linking command.

Here is yet another weird scenario:

             .--->  X  --->  -as-needed A -no-as-needed
             |
    main ----|
             |
             '--->  Y  --->  -as-needed B -no-as-needed

CMakeLists.txt to reproduce it:
cmake_minimum_required(VERSION 3.5)

file(WRITE a.cpp "")
file(WRITE b.cpp "")
file(WRITE x.cpp "")
file(WRITE y.cpp "")
file(WRITE main.cpp "int main(){return 0;}")

add_library(A SHARED a.cpp)
add_library(B SHARED b.cpp)

add_library(X SHARED x.cpp)
add_library(Y SHARED y.cpp)


target_link_libraries(X
    -Wl,-as-needed A -Wl,-no-as-needed
)
target_link_libraries(Y
    -Wl,-as-needed B -Wl,-no-as-needed
)

add_executable(main main.cpp)
target_link_libraries(main X Y)
The result if that both libA and libB are linked in the final executable 
'main'. The content of CMakeFiles/main.d/link.txt:

/usr/bin/c++       CMakeFiles/main.dir/main.cpp.o  -o main -rdynamic libX.so 
libY.so libA.so -Wl,-as-needed -Wl,-no-as-needed libB.so -Wl,-rpath,/tmp/build


Best regards,
Sergio


On 14/03/16 15:58, Brad King wrote:

On 03/14/2016 09:33 AM, Sergio Checa wrote:


    target_link_libraries(L
        -Wl,-whole-archive A -Wl,-no-whole-archive
        -Wl,-whole-archive B -Wl,-no-whole-archive
    )

    add_executable(main main.cpp)
    target_link_libraries(main L)



Specifying flags anywhere except the final executable's target_link_libraries
is not very well defined.  I'd rather not try to define behavior different
than has been there for a long time.

It looks like you're trying to achieve what OBJECT libraries are for:

  https://cmake.org/cmake/help/v3.5/command/add_library.html#object-libraries

Please try that approach instead.

-Brad


-- 

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-developers

Reply via email to