Background info:
On version 3.3.20150618. RedHawk Linux 5.1.1 (real-time variant of RHEL5).

Description:
I am not understanding the behavior of these two commands or am getting 
inconsistent results. Sometimes when the results of a found static library from 
FIND_LIBRARY are passed to TARGET_LINK_LIBRARIES, it generates "/path/to/lib" 
linker syntax BUT other times it produces a "-Wl,-Bstatic -llib -Wl,-Bdynamic" 
syntax. I've confirmed that both lib vars as returned from FIND_LIBRARY are 
full paths to .a static archive files so how can the different handling at the 
linker CLI be explained?

Steps to reproduce:
Unknown. Some libs are handled one way and others are handled another. The only 
potential lead may be that they come from different paths on the file system 
(say one from /usr/lib and another from LIB_DIR=/sim/lib/v67/ihawk).

Example:
PROJECT(ec_interface)

# static arhive #1 from /sim/lib/v67/ihawk
FILE(TO_CMAKE_PATH $ENV{LIB_DIR} LIB_D)
FIND_LIBRARY(libshm NAMES shm PATHS ${LIB_D} NO_DEFAULT_PATH)
MESSAGE("libshm: " ${libshm})

# static archive #2 from /usr/lib
FILE(TO_CMAKE_PATH /usr/lib USR_LIB)
FIND_LIBRARY(libccur_fbsched NAMES libccur_fbsched.a PATHS ${USR_LIB} 
NO_DEFAULT_PATH)
MESSAGE("libccur_fbsched: " ${libccur_fbsched})

SET(SOURCES ec_interface.cpp)
ADD_EXECUTABLE(ec_interface ${SOURCES})
TARGET_LINK_LIBRARIES(ec_interface ${libshm} ${libccur_fbsched})

Notice in the resulting linker command below how libshm and libccur_fbsched are 
handled very differently, why is this?:

/usr/bin/g++ -O3 -DNDEBUG CMakeFiles/ec_interface.dir/ec_interface.cpp.o -o 
../../../../ec_interface -rdynamic /sim/lib/v67/ihawk/libshm.a -Wl,-Bstatic 
-lccur_fbsched -Wl,-Bdynamic

If I remove libccur_fbsched from the TARGET_LINK_LIBRARIES, the resulting 
linker command is:

/usr/bin/g++   -O3 -DNDEBUG   CMakeFiles/ec_interface.dir/ec_interface.cpp.o -o 
../../../../ec_interface -rdynamic /sim/lib/v67/ihawk/libshm.a

I guess it's also important to note that in LIB_D, only .a files exist (i.e. 
there is only a libshm.a and no libshm.so file). However, in /usr/lib, there 
are multiple files by the same name with different suffixes (e.g. 
libccur_fbsched.a, libccur_fbsched.so, etc.). That is why I am specifying the 
".a" explicitly in the FIND_LIBRARY command for libccur_fbsched in an attempt 
to force it to pick up the static archive and not the dynamic ones. The message 
I'm printing seems to indicate it is using the static, so I still don't 
understand the resulting link command. How fine tuned of control do I have over 
the resulting link command? I.e. can I force libccur_fbsched to show up as 
"/usr/lib/libccur_fbsched.a" and not as "-Wl,-Bstatic -lccur_fbsched 
-Wl,-Bdynamic"?

Lastly, I've found that if I instead ADD_LIBRARY as shown below, I can force 
the generated link command to use simply "/usr/lib/libccur_fbsched.a" as 
desired although I don't believe this is the recommended way of doing things. I 
thought FIND_LIBRARY was supposed to be used here (whereas ADD_LIBRARY is 
intended to be used when the library is created within the scope of current 
CMake project)?  Can anyone explain how/why CMake is generating different 
linker output for different static archives that are found using the same 
method (i.e. using FIND_LIBRARY then passing result to TARGET_LINK_LIBRARIES) 
where the extension is specified in one case but not the other?

ADD_LIBRARY(libccur_fbsched STATIC IMPORTED)
SET_PROPERTY(TARGET libccur_fbsched PROPERTY IMPORTED_LOCATION 
${USR_LIB}/libccur_fbsched${LIBEXT})
TARGET_LINK_LIBRARIES(ec_interface ${libshm} libccur_fbsched)

/usr/bin/g++   -O3 -DNDEBUG CMakeFiles/ec_interface.dir/ec_interface.cpp.o -o 
../../../../ec_interface -rdynamic /sim/lib/v67/ihawk/libshm.a 
/usr/lib/libccur_fbsched.a


Thanks,
Anthony Ette
Technical Specialist, Software & Modeling

Rolls-Royce Controls and Data Services
7661 N Perimeter Rd
Indianapolis, IN 46241
tel: +1 (317) 230-6943
mob: +1 (317) 864-7975
email: [email protected]<mailto:[email protected]>

This e-mail (including attachments) contains contents owned by Rolls-Royce plc 
and its subsidiaries, affiliated companies or customers and covered by the laws 
of England and Wales, Brazil, US, or Canada (federal, state or provincial). The 
information contained in this email is intended to be confidential, may be 
legally privileged and subject to export controls which may restrict the access 
to and transfer of the information. If you are not the intended recipient, you 
are hereby notified that any retention, dissemination, distribution, 
interception or copying of this communication is strictly prohibited and may 
subject you to further legal action. Reply to the sender if you received this 
email by accident, and then delete the email and any attachments.
-- 

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