[CMake] Link directories order

Renaud Detry renaudjdetry at airpost.net
Tue Nov 6 16:58:40 EST 2007


> Renaud Detry wrote:
>>> Did you build it using ADD_LIBRARY?
>>> If yes:
>>> PROJECT(HELLO)
>>> ADD_LIBRARY(Hello foo.c)
>>> ADD_EXECUTABLE(HelloBin bar.c)
>>> TARGET_LINK_LIBRARIES(HelloBin Hello)
>> This is exactly what I have.
>>> ADD_LIBRARY defines the TARGET "Hello" in the above lines. That  
>>> should link to the local libHello even if you have another  
>>> version in the system.
>> This is what I thought, too. Unfortunately it doesn't.
>
> This sounds like a bug.   Can you send the output of make VERBOSE=1?

Here's the term output (at the end), and a word about the build context:

[...]

I understand cmake smart-orders link directory flags. However, flags
coming from the shell env LDFLAGS don't seem to be taken into account
in this smart sort.

To illustrate the issue, I slightly modified the example code from

   http://www.cmake.org/HTML/cmakeExample.tar.gz

The only change is in

   cmakeExample.tar.gz:CMakeExample/Hello/CMakeLists.txt

which becomes

# Create a library called "Hello" which includes the source file  
"hello.cxx".
# The extension is already found.  Any number of sources could be  
listed here.
add_library (Hello hello.cxx)

INSTALL(TARGETS Hello
         RUNTIME DESTINATION bin
         ARCHIVE DESTINATION lib
         LIBRARY DESTINATION lib)

As one can see in the attached terminal output, the linker for Demo
looks in /tmp/lib before looking in the build dir:

   /usr/bin/c++ -headerpad_max_install_names -fPIC -L/tmp/lib
   "CMakeFiles/helloDemo.dir/demo.o"
   "CMakeFiles/helloDemo.dir/demo_b.o" -o helloDemo
   -L/Volumes/Data/Users/detryr/tmp/CMakeExample/Hello -lHello

As a result, Demo is linked against an obsolete installed version of
Hello, instead of the local fresh one.

Note that /tmp/lib was empty when I ran cmake.

[detryr at MacBook-Pro] $ export LDFLAGS=-L/tmp/lib           [~/tmp/ 
CMakeExample]
[detryr at MacBook-Pro] $ rm /tmp/lib/libHello.a              [~/tmp/ 
CMakeExample]
rm: /tmp/lib/libHello.a: No such file or directory
[detryr at MacBook-Pro] $ cmake -DCMAKE_INSTALL_PREFIX=/tmp   [~/tmp/ 
CMakeExample]
-- Check for working C compiler: /usr/bin/gcc
-- Check for working C compiler: /usr/bin/gcc -- works
-- Check size of void*
-- Check size of void* - done
-- Check for working CXX compiler: /usr/bin/c++
-- Check for working CXX compiler: /usr/bin/c++ -- works
-- Configuring done
-- Generating done
-- Build files have been written to: /Volumes/Data/Users/detryr/tmp/ 
CMakeExample
[detryr at MacBook-Pro] $ make VERBOSE=1                      [~/tmp/ 
CMakeExample]
/usr/local/cmake-2.4.7-Darwin-universal/bin/cmake -H/Volumes/Data/ 
Users/detryr/tmp/CMakeExample -B/Volumes/Data/Users/detryr/tmp/ 
CMakeExample --check-build-system CMakeFiles/Makefile.cmake 0
Clearing dependencies in "Hello/CMakeFiles/Hello.dir/depend.make".
Clearing dependencies in "Hello/CMakeFiles/Hello.dir/depend.internal".
Clearing dependencies in "Demo/CMakeFiles/helloDemo.dir/depend.make".
Clearing dependencies in "Demo/CMakeFiles/helloDemo.dir/ 
depend.internal".
/usr/local/cmake-2.4.7-Darwin-universal/bin/cmake -E  
cmake_progress_start /Volumes/Data/Users/detryr/tmp/CMakeExample/ 
CMakeFiles 3
make -f CMakeFiles/Makefile2 all
make -f Hello/CMakeFiles/Hello.dir/build.make Hello/CMakeFiles/ 
Hello.dir/depend
Scanning dependencies of target Hello
cd /Volumes/Data/Users/detryr/tmp/CMakeExample && /usr/local/ 
cmake-2.4.7-Darwin-universal/bin/cmake -E cmake_depends "Unix  
Makefiles" /Volumes/Data/Users/detryr/tmp/CMakeExample /Volumes/Data/ 
Users/detryr/tmp/CMakeExample/Hello /Volumes/Data/Users/detryr/tmp/ 
CMakeExample /Volumes/Data/Users/detryr/tmp/CMakeExample/Hello / 
Volumes/Data/Users/detryr/tmp/CMakeExample/Hello/CMakeFiles/Hello.dir/ 
DependInfo.cmake
make -f Hello/CMakeFiles/Hello.dir/build.make Hello/CMakeFiles/ 
Hello.dir/build
/usr/local/cmake-2.4.7-Darwin-universal/bin/cmake -E  
cmake_progress_report /Volumes/Data/Users/detryr/tmp/CMakeExample/ 
CMakeFiles 1
[ 33%] Building CXX object Hello/CMakeFiles/Hello.dir/hello.o
/usr/bin/c++    -o Hello/CMakeFiles/Hello.dir/hello.o -c /Volumes/ 
Data/Users/detryr/tmp/CMakeExample/Hello/hello.cxx
Linking CXX static library libHello.a
cd /Volumes/Data/Users/detryr/tmp/CMakeExample/Hello && /usr/local/ 
cmake-2.4.7-Darwin-universal/bin/cmake -P CMakeFiles/Hello.dir/ 
cmake_clean_target.cmake
cd /Volumes/Data/Users/detryr/tmp/CMakeExample/Hello && /usr/local/ 
cmake-2.4.7-Darwin-universal/bin/cmake -E cmake_link_script  
CMakeFiles/Hello.dir/link.txt --verbose=1
/usr/bin/ar cr libHello.a  "CMakeFiles/Hello.dir/hello.o"
/usr/bin/ranlib libHello.a
/usr/local/cmake-2.4.7-Darwin-universal/bin/cmake -E  
cmake_progress_report /Volumes/Data/Users/detryr/tmp/CMakeExample/ 
CMakeFiles  1
[ 33%] Built target Hello
make -f Demo/CMakeFiles/helloDemo.dir/build.make Demo/CMakeFiles/ 
helloDemo.dir/depend
Scanning dependencies of target helloDemo
cd /Volumes/Data/Users/detryr/tmp/CMakeExample && /usr/local/ 
cmake-2.4.7-Darwin-universal/bin/cmake -E cmake_depends "Unix  
Makefiles" /Volumes/Data/Users/detryr/tmp/CMakeExample /Volumes/Data/ 
Users/detryr/tmp/CMakeExample/Demo /Volumes/Data/Users/detryr/tmp/ 
CMakeExample /Volumes/Data/Users/detryr/tmp/CMakeExample/Demo / 
Volumes/Data/Users/detryr/tmp/CMakeExample/Demo/CMakeFiles/ 
helloDemo.dir/DependInfo.cmake
make -f Demo/CMakeFiles/helloDemo.dir/build.make Demo/CMakeFiles/ 
helloDemo.dir/build
/usr/local/cmake-2.4.7-Darwin-universal/bin/cmake -E  
cmake_progress_report /Volumes/Data/Users/detryr/tmp/CMakeExample/ 
CMakeFiles 2
[ 66%] Building CXX object Demo/CMakeFiles/helloDemo.dir/demo.o
/usr/bin/c++   -I/Volumes/Data/Users/detryr/tmp/CMakeExample/Hello   - 
o Demo/CMakeFiles/helloDemo.dir/demo.o -c /Volumes/Data/Users/detryr/ 
tmp/CMakeExample/Demo/demo.cxx
/usr/local/cmake-2.4.7-Darwin-universal/bin/cmake -E  
cmake_progress_report /Volumes/Data/Users/detryr/tmp/CMakeExample/ 
CMakeFiles 3
[100%] Building CXX object Demo/CMakeFiles/helloDemo.dir/demo_b.o
/usr/bin/c++   -I/Volumes/Data/Users/detryr/tmp/CMakeExample/Hello   - 
o Demo/CMakeFiles/helloDemo.dir/demo_b.o -c /Volumes/Data/Users/ 
detryr/tmp/CMakeExample/Demo/demo_b.cxx
Linking CXX executable helloDemo
cd /Volumes/Data/Users/detryr/tmp/CMakeExample/Demo && /usr/local/ 
cmake-2.4.7-Darwin-universal/bin/cmake -P CMakeFiles/helloDemo.dir/ 
cmake_clean_target.cmake
cd /Volumes/Data/Users/detryr/tmp/CMakeExample/Demo && /usr/bin/c+ 
+     -headerpad_max_install_names -fPIC -L/tmp/lib "CMakeFiles/ 
helloDemo.dir/demo.o" "CMakeFiles/helloDemo.dir/demo_b.o"   -o  
helloDemo  -L/Volumes/Data/Users/detryr/tmp/CMakeExample/Hello -lHello
/usr/local/cmake-2.4.7-Darwin-universal/bin/cmake -E  
cmake_progress_report /Volumes/Data/Users/detryr/tmp/CMakeExample/ 
CMakeFiles  2 3
[100%] Built target helloDemo
/usr/local/cmake-2.4.7-Darwin-universal/bin/cmake -E  
cmake_progress_start /Volumes/Data/Users/detryr/tmp/CMakeExample/ 
CMakeFiles 0
[detryr at MacBook-Pro] $ make install                        [~/tmp/ 
CMakeExample]
[ 33%] Built target Hello
[100%] Built target helloDemo
Install the project...
-- Install configuration: ""
-- Install configuration: ""
-- Installing /tmp/lib/libHello.a
-- Install configuration: ""
[detryr at MacBook-Pro] $                                     [~/tmp/ 
CMakeExample]



More information about the CMake mailing list