Clion Undefined symbols for architecture x86_64 [d

2019-08-14 06:40发布

问题:

This question already has an answer here:

  • What is an undefined reference/unresolved external symbol error and how do I fix it? 33 answers

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!

回答1:

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.



标签: c++ cmake clion