使用静态库链接时链接错误

时间:2013-03-26 16:48:47

标签: c++ visual-studio static-libraries linkage

之前可能会问过这个问题,但是,我发现它只是在Classes的上下文中,而事实并非如此。

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;
}

这两个文件已在Visual Studio 2012中以调试模式编译为静态库。 现在我尝试在一个单独的项目中使用它们,我们称之为MainProject:
1.将“Utils.vcproj”添加到MainProject解决方案 2.使MainProject依赖于Utils
3.在“属性” - &gt;“链接器” - &gt;“输入” - &gt;“其他依赖关系”中将路径放到Utils.lib

以下是使用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项目本身...... 任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:0)

看起来你的Utils.cpp中没有定义方法numOfDivisors(),你能检查一次吗?

为什么你的编译器抱怨“G:\ ProjectEuler \ Problem12 \ Source.obj”? Source.obj来自哪里?

您必须在一个字段中指定库路径,在其他字段中指定库名称,是否在适当的设置下指定了两者?

答案 1 :(得分:0)

假设库已正确构建和链接,则错误的下一个最可能原因是该函数在库中的其他名称与在链接到它的代码中的名称相同。

这可能是由影响名称修饰或类型名称的任意数量的项目设置引起的。从远处猜测,在你的情况下,特定设置是罪魁祸首并没有任何意义。您可以比较两个项目的属性(手动或使用差异工具),并尝试找出导致不同的装饰函数名称的差异。