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 ??