2013-03-26 6 views
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; 
} 

Эти два файла были собраны с Visual Studio 2012 в режиме отладки, как статическая библиотека. Теперь я пытаюсь использовать их в отдельном проекте, назовем его MainProject:
1. Добавьте решение «Utils.vcproj» в MainProject.
2. Сделайте MainProject зависеть от Utils
3. В окне "Свойства" -> "линкер" -> "Input" -> "Дополнительные зависимости" положить путь к 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)" ([email protected]@[email protected]) referenced in function _main G:\ProjectEuler\Problem12\Source.obj Problem12 

Почему не может его найти код, который реализует "numOfDivisors"? Я дал ему .lib, который содержит его, более того - ставит зависимость от самого проекта Utils ... Любая помощь будет оценена.

+0

Является ли ваша библиотека скомпилированной как 'C' или как' C++'? – SomeWittyUsername

+0

Где я могу это проверить? – BegemoD

ответ

0

Похоже, метод numOfDivisors() не указан в вашем Utils.cpp, вы можете его проверить один раз?

И почему ваш компилятор жалуется «G: \ ProjectEuler \ Problem12 \ Source.obj»? Откуда приходит Source.obj?

Вы должны указать путь библиотеки в одном поле и имя библиотеки в другом поле, вы указали оба в соответствующих настройках?

+0

Насколько я знаю, я могу указать полный путь .lib в разделе «Свойства» -> «Linker» -> «Input» -> «Additional Dependencies». По крайней мере, это сработало для меня в Visual2010. – BegemoD

+0

Я не знал об этом –

0

Предполагая, что библиотека правильно построена и связана, следующая, скорее всего, причина ошибки заключается в том, что функция называется чем-то другим в библиотеке, чем в коде, который ссылается на нее.

Это может быть вызвано любым количеством параметров проекта, которые влияют на имена имен или имена типов. На самом деле нет никакого смысла в угадывании с расстояния, какой конкретной настройкой является виновник в вашем случае. Вы можете сравнить свойства двух проектов (вручную или с помощью инструмента diff) и попытаться определить разницу, которая приведет к другому украшенному имени функции.

 Смежные вопросы

  • Нет связанных вопросов^_^