On 25. Aug, 2009, at 15:06, Pol Monsó IRI wrote:
Hello cmake users!
I'm quite new to cmake as well as makefiles, and i've bumped the same
trouble twice. I'm trying to break a source code into several
libraries and
a main program. The scenario has one main executable called
calClient which
uses functions from three libraries, let's say 1A 1B and 2C.
Everybody uses
library 2C, that is calClient, 1A and 1B. I've stored the source
codes of 1A
1C and 2C in a subdirectory called lib/ toghether with a
CMakeLists.txt :
FIND_PACKAGE(YARP REQUIRED)
SET(PROJECT_LIBS
2C.cpp
2C.h
1B.cpp
1B.h
1A.cpp
1A.hpp
)
add_library(callibs ${PROJECT_LIBS})
In the upper directory, toghether with the source code of the main
program,
I have:
project(calibration)
cmake_minimum_required(VERSION 2.6)
set(CMAKE_CXX_FLAGS "-g -Wall")
DON'T EVER do something like this unless you really know what you're
doing. The proper way of doing this is to use the Debug configuration
at configure-time:
cmake -DCMAKE_BUILD_TYPE=Debug -DCMAKE_CXX_FLAGS=-Wall /path/to/source
set(PROJECT_SRC
calClient.cpp
calClient.hpp
chaser.cpp
chaser.hpp
)
FIND_PACKAGE(YARP REQUIRED)
FIND_PACKAGE(OpenCV REQUIRED)
add_subdirectory(lib)
INCLUDE_DIRECTORIES(${PROJECT_SOURCE_DIR}/lib)
link_directories(lib)
INCLUDE_DIRECTORIES(${OPENCV_INCLUDE_DIR})
ADD_EXECUTABLE(calClient ${PROJECT_SRC})
TARGET_LINK_LIBRARIES( calClient ${OPENCV_LIBRARIES} )
TARGET_LINK_LIBRARIES( calClient callibs )
This should be:
TARGET_LINK_LIBRARIES( calClient
${OPENCV_LIBRARIES}
callibs
)
Every header includes the headers of the files which contains the
functions
that it needs. So, calClient.hpp actually includes 1A, 1B and 2C.
The output of the make command is then:
[ 60%] Built target callibs
Linking CXX executable calClient
CMakeFiles/calClient.dir/calClient.cpp.o: In function
`incrementalCalibrate(yarp::dev::IPositionControl*,
yarp::dev::IEncoders*)':
/home/pmonso/YARP/Calclient/calClient.cpp:276: undefined reference to
`print_double_array(double const*, int)'
/home/pmonso/YARP/Calclient/calClient.cpp:277: undefined reference to
`print_double_array(double const*, int)'
/home/pmonso/YARP/Calclient/calClient.cpp:295: undefined reference to
`print_double_array(double const*, int)'
CMakeFiles/calClient.dir/calClient.cpp.o: In function
`calibrate(yarp::dev::IPositionControl*, yarp::dev::IEncoders*)':
/home/pmonso/YARP/Calclient/calClient.cpp:155: undefined reference to
`print_double_array(double const*, int)'
CMakeFiles/calClient.dir/calClient.cpp.o: In function
`randomCalibrate(yarp::dev::IPositionControl*,
yarp::dev::IEncoders*)':
/home/pmonso/YARP/Calclient/calClient.cpp:207: undefined reference to
`print_double_array(double const*, int)'
CMakeFiles/calClient.dir/calClient.cpp.o:/home/pmonso/YARP/
Calclient/calClient.cpp:208:
more undefined references to `print_double_array(double const*,
int)' follow
collect2: ld returned 1 exit status
make[2]: *** [calClient] Error 1
make[1]: *** [CMakeFiles/calClient.dir/all] Error 2
make: *** [all] Error 2
In order for this output to be useful, we'd need to see the link-line,
which you can get by invoking
make VERBOSE=1
The function print_double_array is located in the 2C source and
header files
which, as I said, is included in calClient header as well as in
headers of
1A and 1B.
Does somebody know why linking fails? What I am doing wrong? It's
driving me
nuts!
It's probably that you invoke TARGET_LINK_LIBRARIES twice on the same
target, as pointed out above.
Thanks alot for your help!
pol
HTH
Michael
_______________________________________________
Powered by www.kitware.com
Visit other Kitware open-source projects at
http://www.kitware.com/opensource/opensource.html
Please keep messages on-topic and check the CMake FAQ at:
http://www.cmake.org/Wiki/CMake_FAQ
Follow this link to subscribe/unsubscribe:
http://www.cmake.org/mailman/listinfo/cmake