2017-04-09 127 views
1

我有一個好奇的「架構未定義符號」的例子,雖然這裏已經被問過很多次,但是我覺得我的錯誤背後的原因更基礎。架構錯誤的未定義符號

我是C++新手,有一個非常基本的程序,不使用第三方庫,因此我不明白爲什麼會這樣,因爲這個問題的其他答案已經提到,涉及到用不同編譯器構建的庫的混合。

這裏是我的代碼在它的全部

的src/myTest.cpp

#include <iostream> 
#include "Point3D.h" 

using namespace std; 
using namespace lspsm; 

int main(int argc, char** argv) { 
    Point3D p(1,2,3); 
    cout << p.getX() << endl; 
    return 0; 
} 

的src/Point3D.h

#ifndef Point3D_H 
#define Point3D_H 

namespace lspsm { 

class Point3D { 
    int p_values [3]; 
public: 
    Point3D(int x, int y, int z); 
    int getX(); 
    int getY(); 
    int getZ(); 
}; 

} 

#endif 

的src/Point3D.cpp

#include Point3D_H 

namespace lspsm { 

Point3D::Point3D(int x, int y, int z) { 
    p_values[0] = x; 
    p_values[1] = y; 
    p_values[2] = z; 
} 

int Point3D::getX() { 
    return p_values[0]; 
} 

int Point3D::getY() { 
    return p_values[1]; 
} 

int Point3D::getZ() { 
    return p_values[2]; 
} 

} 

的src /的CMakeLists.txt

add_executable(myTest myTest.cpp) 

構建我跑

cmake ../src 
make 

這工作得很好之前,我開始使用內部mainPoint3D類,但現在我看到的錯誤

-- Configuring done 
-- Generating done 
-- Build files have been written to: /Users/mh/dev/CPP/build 
[ 50%] Linking CXX executable myTest 
Undefined symbols for architecture x86_64: 
    "lspsm::Point3D::getX()", referenced from: 
     _main in myTest.o 
    "lspsm::Point3D::Point3D(int, int, int)", referenced from: 
     _main in myTest.o 
ld: symbol(s) not found for architecture x86_64 
clang: error: linker command failed with exit code 1 (use -v to see invocation) 

我寫了Point3D錯誤的類實現嗎?

我使用make 3.81在OS X Sierra上運行此操作。

回答

1

在你CMakeLists.txt,您還需要添加Point3D.cpp到列表的add_executable來源:

add_executable(myTest myTest.cpp Point3D.cpp) 
+0

這個工作!謝謝。有沒有辦法引用一個目錄中的所有文件,如果我結束了很多類。 – clicky

+1

我不這樣做在我自己的項目,但這篇文章似乎有一些合理的建議:http://stackoverflow.com/questions/2110795/how-to-find-all-c-files-for-cmake-構建系統 –

相關問題