Ask Your Question

Revision history [back]

click to hide/show revision 1
initial version

Help with "Undefined-reference" when compiling with CMake for OpenCV & C++ program

I'm following a book tutorial to add slider and mouse events to an interface with OpenCV and C++. I'm working in terminal Ubuntu and compile my project with CMake. Here, I have 2 programs, sample1.cpp and sample2.cpp. Now, sample1 worked just fine I can run it properly. When after I added sample2 and tried to compile it, I encountered this :

[ 25%] Building CXX object CMakeFiles/sample1.dir/sample1.cpp.o
[ 50%] Linking CXX executable sample1
[ 50%] Built target sample1
Scanning dependencies of target sample2
[ 75%] Building CXX object CMakeFiles/sample2.dir/sample2.cpp.o
[100%] Linking CXX executable sample2
CMakeFiles/sample2.dir/sample2.cpp.o: In function `main':
sample2.cpp:(.text+0x15b): undefined reference to `onChange(int, void*)'
sample2.cpp:(.text+0x1ec): undefined reference to `onMouse(int, int, int, int, void*)'
sample2.cpp:(.text+0x229): undefined reference to `onChange(int, void*)'
collect2: error: ld returned 1 exit status
CMakeFiles/sample2.dir/build.make:146: recipe for target 'sample2' failed
make[2]: *** [sample2] Error 1
CMakeFiles/Makefile2:104: recipe for target 'CMakeFiles/sample2.dir/all' failed
make[1]: *** [CMakeFiles/sample2.dir/all] Error 2
Makefile:83: recipe for target 'all' failed
make: *** [all] Error 2

Looks like linker error but I think I have added all the necessary libs. Here's my code to sample2 :

#include <iostream>
#include "opencv2/core.hpp"
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/imgproc.hpp"
using namespace cv;
using namespace std;

//create variable to save the position of value in track
int blurAmount = 15;

//Trackball call back function
void onChange(int pos, void* userInput);

//Mouse callback
void onMouse(int event, int x, int y, int, void* userInput);

int main(int argc, const char** argv){
         //Read images
         Mat img1 = imread("image_one.jpg");

         //Create windows
         namedWindow("Image1");

         //Create a trackbar --
         createTrackbar("Image1", "Image1", &blurAmount, 30, onChange, &img1);
         setMouseCallback("Image1", onMouse, &img1);


         //Call to onChange to init
         onChange(blurAmount, &img1);

         waitKey(0);
         destroyWindow("Image1");
         return 0;

 }

I believe my CMakeLists isn't the problem here, since it works fine with sample1. But here's my CMakeLists.txt in case it's necessary.

cmake_minimum_required(VERSION 3.0)
PROJECT(Chapter3)

FIND_PACKAGE(OpenCV REQUIRED)
INCLUDE_DIRECTORIES(${OpenCV_INCLUDE_DIRS})
LINK_DIRECTORIES(${OpenCV_LIB_DIR})

ADD_EXECUTABLE(sample1 sample1.cpp)
TARGET_LINK_LIBRARIES(sample1 ${OpenCV_LIBS})

ADD_EXECUTABLE(sample2 sample2.cpp)
TARGET_LINK_LIBRARIES(sample2 ${OpenCV_LIBS})

And advice what could be causing those errors ??

Help with "Undefined-reference" when compiling with CMake for OpenCV & C++ program

I'm following a book tutorial to add slider and mouse events to an interface with OpenCV and C++. I'm working in terminal Ubuntu and compile my project with CMake. Here, I have 2 programs, sample1.cpp and sample2.cpp. Now, sample1 worked just fine I can run it properly. When after I added sample2 to my CMakeLists and tried to compile it, I encountered this :

[ 25%] Building CXX object CMakeFiles/sample1.dir/sample1.cpp.o
[ 50%] Linking CXX executable sample1
[ 50%] Built target sample1
Scanning dependencies of target sample2
[ 75%] Building CXX object CMakeFiles/sample2.dir/sample2.cpp.o
[100%] Linking CXX executable sample2
CMakeFiles/sample2.dir/sample2.cpp.o: In function `main':
sample2.cpp:(.text+0x15b): undefined reference to `onChange(int, void*)'
sample2.cpp:(.text+0x1ec): undefined reference to `onMouse(int, int, int, int, void*)'
sample2.cpp:(.text+0x229): undefined reference to `onChange(int, void*)'
collect2: error: ld returned 1 exit status
CMakeFiles/sample2.dir/build.make:146: recipe for target 'sample2' failed
make[2]: *** [sample2] Error 1
CMakeFiles/Makefile2:104: recipe for target 'CMakeFiles/sample2.dir/all' failed
make[1]: *** [CMakeFiles/sample2.dir/all] Error 2
Makefile:83: recipe for target 'all' failed
make: *** [all] Error 2

Looks like linker error but I think I have added all the necessary libs. Here's my code to sample2 :

#include <iostream>
#include "opencv2/core.hpp"
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/imgproc.hpp"
using namespace cv;
using namespace std;

//create variable to save the position of value in track
int blurAmount = 15;

//Trackball call back function
void onChange(int pos, void* userInput);

//Mouse callback
void onMouse(int event, int x, int y, int, void* userInput);

int main(int argc, const char** argv){
         //Read images
         Mat img1 = imread("image_one.jpg");

         //Create windows
         namedWindow("Image1");

         //Create a trackbar --
         createTrackbar("Image1", "Image1", &blurAmount, 30, onChange, &img1);
         setMouseCallback("Image1", onMouse, &img1);


         //Call to onChange to init
         onChange(blurAmount, &img1);

         waitKey(0);
         destroyWindow("Image1");
         return 0;

 }

I believe my CMakeLists isn't the problem here, since it works fine with sample1. But here's my CMakeLists.txt in case it's necessary.

cmake_minimum_required(VERSION 3.0)
PROJECT(Chapter3)

FIND_PACKAGE(OpenCV REQUIRED)
INCLUDE_DIRECTORIES(${OpenCV_INCLUDE_DIRS})
LINK_DIRECTORIES(${OpenCV_LIB_DIR})

ADD_EXECUTABLE(sample1 sample1.cpp)
TARGET_LINK_LIBRARIES(sample1 ${OpenCV_LIBS})

ADD_EXECUTABLE(sample2 sample2.cpp)
TARGET_LINK_LIBRARIES(sample2 ${OpenCV_LIBS})

And advice what could be causing those errors ??

Help with "Undefined-reference" when compiling with CMake for OpenCV & C++ program

I'm following a book tutorial to add slider and mouse events to an interface with OpenCV and C++. I'm working in terminal Ubuntu and compile my project with CMake. Here, I have 2 programs, sample1.cpp and sample2.cpp. Now, sample1 worked just fine I can run it properly. When I added sample2 to my CMakeLists and tried to compile it, I encountered this :

[ 25%] Building CXX object CMakeFiles/sample1.dir/sample1.cpp.o
[ 50%] Linking CXX executable sample1
[ 50%] Built target sample1
Scanning dependencies of target sample2
[ 75%] Building CXX object CMakeFiles/sample2.dir/sample2.cpp.o
[100%] Linking CXX executable sample2
CMakeFiles/sample2.dir/sample2.cpp.o: In function `main':
sample2.cpp:(.text+0x15b): undefined reference to `onChange(int, void*)'
sample2.cpp:(.text+0x1ec): undefined reference to `onMouse(int, int, int, int, void*)'
sample2.cpp:(.text+0x229): undefined reference to `onChange(int, void*)'
collect2: error: ld returned 1 exit status
CMakeFiles/sample2.dir/build.make:146: recipe for target 'sample2' failed
make[2]: *** [sample2] Error 1
CMakeFiles/Makefile2:104: recipe for target 'CMakeFiles/sample2.dir/all' failed
make[1]: *** [CMakeFiles/sample2.dir/all] Error 2
Makefile:83: recipe for target 'all' failed
make: *** [all] Error 2

Looks like linker error but I think I have added all the necessary libs. Here's my code to sample2 :

#include <iostream>
#include "opencv2/core.hpp"
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/imgproc.hpp"
using namespace cv;
using namespace std;

//create variable to save the position of value in track
int blurAmount = 15;

//Trackball call back function
void onChange(int pos, void* userInput);

//Mouse callback
void onMouse(int event, int x, int y, int, void* userInput);

int main(int argc, const char** argv){
         //Read images
         Mat img1 = imread("image_one.jpg");

         //Create windows
         namedWindow("Image1");

         //Create a trackbar --
         createTrackbar("Image1", "Image1", &blurAmount, 30, onChange, &img1);
         setMouseCallback("Image1", onMouse, &img1);

          //Call to onChange to init
         onChange(blurAmount, &img1);

         waitKey(0);
         destroyWindow("Image1");
         return 0;

 }

I believe my CMakeLists isn't the problem here, since it works fine with sample1. But here's my CMakeLists.txt in case it's necessary.

cmake_minimum_required(VERSION 3.0)
PROJECT(Chapter3)

FIND_PACKAGE(OpenCV REQUIRED)
INCLUDE_DIRECTORIES(${OpenCV_INCLUDE_DIRS})
LINK_DIRECTORIES(${OpenCV_LIB_DIR})

ADD_EXECUTABLE(sample1 sample1.cpp)
TARGET_LINK_LIBRARIES(sample1 ${OpenCV_LIBS})

ADD_EXECUTABLE(sample2 sample2.cpp)
TARGET_LINK_LIBRARIES(sample2 ${OpenCV_LIBS})

And advice what could be causing those errors ??

Help with "Undefined-reference" when compiling with CMake for OpenCV & C++ program

I'm following a book tutorial to add slider and mouse events to an interface with OpenCV and C++. I'm working in terminal Ubuntu and compile my project with CMake. Here, I have 2 programs, sample1.cpp and sample2.cpp. Now, sample1 worked just fine I can run it properly. When I added sample2 to my CMakeLists and tried to compile it, I encountered this :

[ 25%] Building CXX object CMakeFiles/sample1.dir/sample1.cpp.o
[ 50%] Linking CXX executable sample1
[ 50%] Built target sample1
Scanning dependencies of target sample2
[ 75%] Building CXX object CMakeFiles/sample2.dir/sample2.cpp.o
[100%] Linking CXX executable sample2
CMakeFiles/sample2.dir/sample2.cpp.o: In function `main':
sample2.cpp:(.text+0x15b): undefined reference to `onChange(int, void*)'
sample2.cpp:(.text+0x1ec): undefined reference to `onMouse(int, int, int, int, void*)'
sample2.cpp:(.text+0x229): undefined reference to `onChange(int, void*)'
collect2: error: ld returned 1 exit status
CMakeFiles/sample2.dir/build.make:146: recipe for target 'sample2' failed
make[2]: *** [sample2] Error 1
CMakeFiles/Makefile2:104: recipe for target 'CMakeFiles/sample2.dir/all' failed
make[1]: *** [CMakeFiles/sample2.dir/all] Error 2
Makefile:83: recipe for target 'all' failed
make: *** [all] Error 2

Looks like linker error but I think I have added all the necessary libs. Here's my code to sample2 :

#include <iostream>
#include "opencv2/core.hpp"
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/imgproc.hpp"
using namespace cv;
using namespace std;

//create variable to save the position of value in track
int blurAmount = 15;

//Trackball call back function
void onChange(int pos, void* userInput);

//Mouse callback
void onMouse(int event, int x, int y, int, void* userInput);

int main(int argc, const char** argv){
         //Read images
         Mat img1 = imread("image_one.jpg");

         //Create windows
         namedWindow("Image1");

         //Create a trackbar --
         createTrackbar("Image1", "Image1", &blurAmount, 30, onChange, &img1);
         setMouseCallback("Image1", onMouse, &img1);

         //Call to onChange to init
         onChange(blurAmount, &img1);

         waitKey(0);
         destroyWindow("Image1");
         return 0;
  }

I believe my CMakeLists isn't the problem here, since it works fine with sample1. But here's my CMakeLists.txt in case it's necessary.

cmake_minimum_required(VERSION 3.0)
PROJECT(Chapter3)

FIND_PACKAGE(OpenCV REQUIRED)
INCLUDE_DIRECTORIES(${OpenCV_INCLUDE_DIRS})
LINK_DIRECTORIES(${OpenCV_LIB_DIR})

ADD_EXECUTABLE(sample1 sample1.cpp)
TARGET_LINK_LIBRARIES(sample1 ${OpenCV_LIBS})

ADD_EXECUTABLE(sample2 sample2.cpp)
TARGET_LINK_LIBRARIES(sample2 ${OpenCV_LIBS})

And advice what could be causing those errors ??