0

これは以前に尋ねられたかもしれませんが、クラスのコンテキストでのみ見つけましたが、そうではありません。

Utils.h

#ifndef _UTILS_H_
#define _UTILS_H_

#include <cmath>

//is 'x' prime?
bool isPrime(long long int x);

//find the number of divisors of 'x' (including 1 and x)
int numOfDivisors(long long int x);

#endif //_UTILS_H_

Utils.cpp

#include "Utils.h"

bool isPrime(long long int x){
if (x < 2){
    return false;
}
long double rootOfX = sqrt( x );
long long int flooredRoot = (long long int)floor ( rootOfX );

for (long long int i = 2; i <= flooredRoot; i++){
    if (x % i == 0){
        return false;
    }
}

return true;
}


int numOfDivisors(long long int x){
if (x == 1){
    return 1;
}

long long int maxDivisor = (x / 2) + 1;
int divisorsCount = 0;
for (long long int i = 2; i<=maxDivisor; i++){
    if (x % i == 0){
        divisorsCount++;
    }
}

divisorsCount += 2; //for 1 & x itself
return divisorsCount;
}

これら 2 つのファイルは、Visual Studio 2012 でデバッグ モードでスタティック ライブラリとしてコンパイルされています。ここで、これらを別のプロジェクトで使用してみます。それを MainProject と呼びましょう
。 1. 「Utils.vcproj」を MainProject ソリューションに追加します。
2. MainProject を Utils に依存するようにし
ます

Utils を使用するメインは次のとおりです。

#include <iostream>
#include "..\Utils\Utils.h"

using namespace std;

int main(){


cout << "num of divisors of " << 28 << ": " << numOfDivisors(28) << endl;

//this part is merely to stop visual studio and look at the output
char x;
cin >> x;
return 0;
}

そして、これは私が得るエラーです:

Error   1   error LNK2019: unresolved external symbol "int __cdecl numOfDivisors(__int64)" (?numOfDivisors@@YAH_J@Z) referenced in function _main   G:\ProjectEuler\Problem12\Source.obj    Problem12

「numOfDivisors」を実装するコードが見つからないのはなぜですか? さらに、それを含む.libを与えました-Utilsプロジェクト自体に依存関係を置きます...どんな助けでも大歓迎です。

4

2 に答える 2

0

ライブラリが正しく構築され、リンクされていると仮定すると、次に考えられるエラーの原因は、リンクするコードとは別の名前がライブラリで付けられていることです。

これは、名前の装飾または型名のいずれかに影響を与えるプロジェクト設定の数が多いことが原因である可能性があります。あなたの場合、どの特定の設定が原因であるかを遠くから推測しても意味がありません。2 つのプロジェクトのプロパティを (手動または diff ツールを使用して) 比較し、装飾された関数名が異なる結果となる違いを見つけようとすることができます。

于 2013-03-27T02:49:14.510 に答える
0

メソッド numOfDivisors() が Utils.cpp で定義されていないようですが、一度確認していただけますか?

そして、コンパイラが「G:\ProjectEuler\Problem12\Source.obj」と不平を言っているのはなぜですか? Source.obj はどこから来たのですか?

1 つのフィールドにライブラリ パスを指定し、別のフィールドにライブラリ名を指定する必要があります。適切な設定で両方を指定しましたか?

于 2013-03-26T16:57:14.953 に答える