6

My code compiled and ran as expected in CodeLite. Then I tried to run the same code in Clion, but it give me this error:

Scanning dependencies of target leastSquareFitting
[ 50%] Building CXX object CMakeFiles/leastSquareFitting.dir/main.cpp.o
[100%] Linking CXX executable leastSquareFitting
Undefined symbols for architecture x86_64:
  "printMatrix(Matrix)", referenced from:
      _main in main.cpp.o
  "constructMatrix(int, std::__1::vector<double, 
std::__1::allocator<double> >)", referenced from:
      _main in main.cpp.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see 
invocation)
make[3]: *** [leastSquareFitting] Error 1
make[2]: *** [CMakeFiles/leastSquareFitting.dir/all] Error 2
make[1]: *** [CMakeFiles/leastSquareFitting.dir/rule] Error 2
make: *** [leastSquareFitting] Error 2

I tried to search this error online, but couldn't solve it based on what I found. Here is my code:

main.cpp

#include "fullMatrix.h"
#include <cstdio>
#include <iostream>
#include <vector>
using namespace std;
int main()
{
    vector<double> value = {1.0,2.0,3.0,4.0};
    Matrix m = constructMatrix(2, value);
    printMatrix(m);
    return 0;
}   

fullMatrix.cpp

#include "fullMatrix.h"
#include <iostream>
#include <vector>
#include "cmath"
#include <cstdio>
using namespace std;


Matrix constructMatrix(int size, vector<double> x) {
    //initiate variables of a matrix
    Matrix myMatrix;
    myMatrix.size = size;
    myMatrix.value = x;
    return myMatrix;
}

void printMatrix(Matrix matrix){
    // Loop through rows and columns to display all values
    for (int row = 0; row < matrix.size; row++) {
        for (int col = 0; col < matrix.size; col++) {
            cout <<matrix.value[col+row*matrix.size] << " ";
        }
        cout << endl;
    }
}

fullMatrix.h

#ifndef fullMatrix_h
#define fullMatrix_h
#include <vector>
using namespace std;

struct Matrix
{
    int size;
    vector<double> value;
};
Matrix constructMatrix(int size, vector<double> x);

void printMatrix(Matrix matrix);

#endif

I am very new to CMake, and this is what's in CMakeLists.txt:

cmake_minimum_required(VERSION 3.10)
project(leastSquareFitting)

set(CMAKE_CXX_STANDARD 11)

add_executable(leastSquareFitting main.cpp)

Thank you! Any help is appreciated!

小小程序猿
  • 63
  • 1
  • 1
  • 4
  • It worked after I added #include "fullMatrix.cpp" to main, can someone please give some insight to why this is and how can I fix it properly? (hopefully just by changing some configurations in Clion) – 小小程序猿 Apr 05 '18 at 00:48
  • Don't #include cpp files, those files have functions' implementations, and the linker will complain when you include the same cpp file in two different files. Instead, let cmake know you need it to compile and link both files for your program. Look at my answer for how to do that. – Daniel Apr 05 '18 at 00:54

1 Answers1

9

Change the last line of your CMakeLists to be:

add_executable(leastSquareFitting main.cpp fullMatrix.cpp)

What the linker is telling you is it cannot find the compiled file that contains the function printMatrix, and if you look at your cmake's output you see cmake is only compiling main.cpp but there is no mention of fullMatrix.cpp:

Building CXX object CMakeFiles/leastSquareFitting.dir/main.cpp.o

The reason it doesn't mention the other file is you hadn't told it that file was part of your sources too.

xaxxon
  • 19,189
  • 5
  • 50
  • 80
Daniel
  • 21,933
  • 14
  • 72
  • 101