Об этом можно было спросить ранее, однако я нашел это только в контексте классов, а это не так.
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. В «Свойствах» -> «Линкер» -> «Ввод» -> «Дополнительные зависимости» укажите путь к 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 …
Любая помощь будет оценена.
Предполагая, что библиотека правильно построена и связана, следующая наиболее вероятная причина ошибки состоит в том, что функция названа в библиотеке как-то иначе, чем в коде, который ссылается на нее.
Это может быть вызвано любым количеством параметров проекта, которые влияют на оформление имен или имена типов. Нет никакого смысла угадывать на расстоянии, какой именно параметр является виновником в вашем случае. Вы можете сравнить свойства двух проектов (вручную или с помощью инструмента сравнения) и попытаться определить разницу, которая привела бы к другому названию оформленной функции.
Похоже, что метод numOfDivisors () не определен в вашем Utils.cpp, вы можете проверить его один раз?
И почему ваш компилятор жалуется на «G: \ ProjectEuler \ Problem12 \ Source.obj»? Откуда исходит Source.obj?
Вы должны указать путь к библиотеке в одном поле и имя библиотеки в другом поле, указали ли вы оба в соответствующих настройках?