静态方法的 Xcode 中的 C++ 链接器错误

Posted

技术标签:

【中文标题】静态方法的 Xcode 中的 C++ 链接器错误【英文标题】:C++ Linker error in Xcode for a Static Method 【发布时间】:2013-08-12 17:22:42 【问题描述】:

我确信这非常简单,但我就是看不到。我在 C++ Xcode 中收到以下链接器错误。

Undefined symbols for architecture x86_64:
"Random::NextInt(int, int)", referenced from:
Helpers::MakeData(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, int) in Helpers.o

Helpers::MakeData

#include "Helpers.h"
#include "Random.h"

void Helpers::MakeData(string dataFile, int numLines)

    vector<double> weights =  -0.1, 0.2, -0.3, 0.4, -0.5,
    0.6, -0.7, 0.8, -0.9, 1.0,
    -1.1, 1.2, -1.3, 1.4, -1.5,
    1.6, -1.7, 1.8, -1.9, 2.0,
    -0.5, 0.6, -0.7, 0.8, -0.9,
    1.5, -1.4, 1.3,
    -1.2, 1.1, -1.0,
    0.9, -0.8, 0.7,
    -0.6, 0.5, -0.4,
    0.3, -0.2, 0.1,
    0.1, -0.3, 0.6 ;

    NeuralNetwork * nn = new NeuralNetwork(4, 5, 3);
    nn->SetWeights(weights);
    ofstream myFile;
    myFile.open(dataFile);
    for (int i = 0; i < numLines; ++i)
    
        vector<double> inputs; 
        for (int j = 0; j < inputs.size(); ++j)
            inputs[j] = Random::NextInt(10, 1);

        vector<double> outputs = nn->ComputeOutputs(inputs);

        string color = "";
        int idx = Helpers::IndexOfLargest(outputs);
        if (idx == 0)  color = "red"; 
        else if (idx == 1)  color = "green"; 
        else if (idx == 2)  color = "blue"; 

        myFile << inputs[0] << " " << inputs[1] << " " << inputs[2] << " " << inputs[3] <<      " " << color;
    
    myFile.close(); 
 // MakeData

随机.h

#ifndef __NeuralClassificationProgram__Random__
#define __NeuralClassificationProgram__Random__

#include <iostream>
class Random

public:
    static double NextDouble();
    static int NextInt(int high, int low);
;

#endif /* defined(__NeuralClassificationProgram__Random__) */

随机.cpp

#include "Random.h"
#include <time.h>
#include <stdlib.h>

double NextDouble()

    double rnd;
    srand(static_cast<unsigned int>(time(NULL)));
    rnd = rand() % 1+0;
    return rnd;


int NextInt(int high, int low)

    int rnd;
    srand(static_cast<unsigned int>(time(NULL)));
    rnd = rand() % high + low;
    return rnd;

【问题讨论】:

Random::NextDoubleRandom::NextInt(int high, int low) 似乎在 Random.cpp 中是必需的。 【参考方案1】:

这是因为您从未定义过Random::NextInt(int, int),而是定义了NextInt(int, int)

换句话说,您忘记了类作用域运算符。 试试

int Random::NextInt(int high, int low)

    return rand() % high + low;

哦,并且不要在您的程序中多次调用srand

【讨论】:

谢谢...这让我很生气。【参考方案2】:

您没有在实现中包含类名限定符,因此这些“静态方法”被编译为简单的全局函数。

例如,您有:

int NextInt(int high, int low)

但你需要:

int Random::NextInt(int high, int low)

【讨论】:

谢谢...这让我很生气。

以上是关于静态方法的 Xcode 中的 C++ 链接器错误的主要内容,如果未能解决你的问题,请参考以下文章

CMake - 链接器错误与静态yaml-cpp作为git子模块

静态库的c ++链接器错误

在 Xcode 中运行 iOS 单元测试时引用 _main 的链接器错误

C ++静态库未在mac上的xcode中编译[重复]

iOS 应用程序的 Xcode 单元测试中的链接问题与嵌入式 C++ 代码

Xcode 7.3.1 中的 C++ 链接错误和未定义引用