2016-03-07 1 views
0

У меня проблема с связыванием библиотеки fftw с помощью cmake. Я использую файл findFFTW.cmake, чтобы найти библиотеку. Я знаю, что это успешно находит библиотеку, потому что я устанавливаю флаг REQUIRED как истину для поиска библиотеки, и процесс make проходит через штраф.CMake находит библиотеку fftw, но не может ссылаться

Несмотря на ссылку на мой исполняемый файл, я все еще получаю неопределенные эталонные ошибки. Некоторые связанные должности, решения которых я пробовал.

Undefined reference to "function name from external library"

http://answers.ros.org/question/171326/catkin-linking-order-undefined-reference-to-symbol/

Обновления

Благодаря ComicSansMS, то CMake ниже теперь должен моделировать зависимости правильно.

CMake файл проекта (обновлено 3/7)

cmake_minimum_required(VERSION 2.8.3) 
project(gist_extractor) 

## Find catkin macros and libraries 

find_package(catkin REQUIRED COMPONENTS 
    roscpp 
    rospy 
    std_msgs 
    image_transport 
    cv_bridge 
    sensor_msgs 
    cmake_modules 
) 

find_package(OpenCV REQUIRED) 
find_package(Eigen REQUIRED) 
find_package(FFTW REQUIRED) 


########### 
## Build ## 
########### 

## Set GIST variables for building library 
set(GIST_PATH /home/andy/Development/lear_gist-1.2) 

## Specify additional locations of header files 
include_directories(include ${catkin_INCLUDE_DIRS} ${GIST_PATH} ${FFTW_INCLUDES}) 

## Declare a gist library 
add_library(gist SHARED ${GIST_PATH}/standalone_image.c ${GIST_PATH}/gist.c) # THIS IS NOT BEING BUILT 
target_link_libraries(gist ${FFTW_LIBRARIES}) 

## Add cmake target dependencies of the library 
#MESSAGE(STATUS "GIST_LIBRARY_PATH: " ${GIST_PATH}) 

## Declare a C++ executable 
add_executable(gist_extractor src/gist_extractor.cpp) 
target_link_libraries(gist_extractor ${catkin_LIBRARIES} gist) 

редактирует 2

Теперь у нас есть ошибки, связывающую если мы используем выше CMake файла. В частности, процесс изготовления не работает, когда я пытаюсь запустить

target_link_libraries(gist_extractor ${catkin_LIBRARIES} gist) 

У меня есть пара наблюдений. Во-первых, моя gist-библиотека строится правильно на основе следующих консольных сообщений.

Linking C shared library /home/andy/Projects/ROS/robot_ws/devel/lib/libgist.so 
[ 80%] Built target gist 
Scanning dependencies of target gist_extractor 
[100%] Building CXX object 
`gist_extractor/CMakeFiles/gist_extractor.dir/src/gist_extractor.cpp.o 

Но мы можем видеть, что есть неопределенные ссылки на ошибки, когда мы пытаемся связать наш исполняемый файл с сутью библиотеки.

Linking CXX executable gist_extractor 
: undefined reference to `color_gist_scaletab' 

Вот почему я не понимаю, почему это происходит. В gist_extractor.cpp я включил файл заголовка, который включает функцию color_gist_scaletab. В частности, этот «color_gist_scaletab» определен в «gist.h» и реализован в «gist.c». Я бы подумал, что создание моей библиотеки должно дать мне доступ к «color_gist_scaletab». Я разместил соответствующие файлы ниже.

gist.h

#ifndef GIST_H_INCLUDED 
#define GIST_H_INCLUDED 

#include "standalone_image.h" 

/*! Graylevel GIST for various scales. Based on Torralba's Matlab 
* implementation. http://people.csail.mit.edu/torralba/code/spatialenvelope/ 
* 
* Descriptor size is w*w*sum(n_orientations[i],i=0..n_scale-1) 
* 
* @param src Source image 
* @param w Number of bins in x and y axis 
*/ 

float *bw_gist_scaletab(image_t *src, int nblocks, int n_scale, const int *n_orientations); 

/*! @brief implementation of grayscale GIST descriptor. 
* Descriptor size is w*w*(a+b+c) 
* 
* @param src Source image 
* @param w Number of bins in x and y axis 
*/ 
float *bw_gist(image_t *scr, int nblocks, int a, int b, int c); 

/*! @brief implementation of color GIST descriptor. 
* 
* @param src Source image 
* @param w Number of bins in x and y axis 
*/ 

float *color_gist(color_image_t *src, int nblocks, int a, int b, int c); 
/*! Color GIST for various scales. Based on Torralba's Matlab 
* implementation. http://people.csail.mit.edu/torralba/code/spatialenvelope/ */ 

float *color_gist_scaletab(color_image_t *src, int nblocks, int n_scale, const int *n_orientations); 


#endif 

gist_extractor.cpp

// color_gist_scaletab is defined in gist.h 
// I'm including relevant header file 
#include "/home/andy/Development/lear_gist-1.2/gist.h" 

//SOME MORE STUFF 
// This is where I call the function 
float *gist_descriptor = color_gist_scaletab(im, nblocks, n_scale, orientations_per_scale); 

ответ

0

Кажется, вы не моделировать зависимостей правильно.

Вы используете fftw изнутри gist.c, который является частью целевой библиотеки gist.

Однако эта цель не имеет зависимости от fftw, только нижняя цель gist_extractor имеет. Это рецепт неприятностей, особенно в статических сборках, где инструментальные узлы часто придирчивы к порядку, в котором библиотеки появляются в командной строке компоновщика.

Добавить FFTW как зависимость к gist:

target_link_libraries(gist ${FFTW_LIBRARIES}) 

Кроме того, нет необходимости делать это:

add_dependencies(gist_extractor gist) 
target_link_libraries(gist_extractor ${GIST_PATH}/libleargist.a) 

Если обе цели построены в рамках одного и того же проекта, просто сделать :

target_link_libraries(gist_extractor gist) 

Используя целевое имя вместо жесткого кодирования выходного файла, вы не только сделать ваш скрипт сборки более переносимым, но и позволить CMake лучше отслеживать межзадачные зависимости для вас.

+0

Эй. Спасибо за комментарии. Это было бесполезно! –

+0

То, как вы моделировали зависимости, имеет большой смысл. После включения ваших предложений, я понимаю, что моя библиотека «gist» не строится. В результате я все еще получаю неопределенные ошибки символов. У вас есть идеи, почему это может быть так и как я могу это исправить? Именно этот вопрос заставлял меня жестко печатать либера. Я обновил код в своем исходном сообщении, чтобы лучше объяснить это. –

+1

@AndyLee Вы уверены, что 'gist' не строится? Потому что в коде, который вы опубликовали, нет ничего, что могло бы вызвать это. Попробуйте запустить 'make gist' из командной строки. Вы не должны жаловаться. – ComicSansMS