ошибка компоновщика: неопределенная ссылка c ++ - PullRequest
4 голосов
/ 01 мая 2009

Я пытался найти похожие проблемы, но не мог легко найти ту, которая помогла моей проблеме.

Я создал проект на C ++ и работаю над UNIX, чтобы скомпилировать, связать и запустить его. Моя конкретная проблема - неопределенная ссылка на метод, который я объявляю в отдельном файле.

В файле SharedCache.cpp у меня есть следующий метод:

int SharedCache::replaceLine(ullong address){
    int evictPID = -1;

    int cacheSet = calcCacheSet( address );
    //random uniformly-distributed value for cache line
    float numLines = static_cast<float>(CACHE_LINES_PER_SET);
    uint cacheLine = static_cast<uint>(uniformDistr( numLines ));

    if(cache[cacheSet][cacheLine] != NULL){
        evictPID = cache[cacheSet][cacheLine]->PID;
    }

    uint PID= calcPID(address);
    uint tag= calcTag(address);

    cache[cacheSet][cacheLine]->setLine(PID, tag); //mutex method

    return PID;
}

Строка uint cacheLine = static_cast<uint>( uniformDistr( numLines )); вызывает функцию, которую я хочу использовать, из другого файла. Ошибка компоновщика - неопределенная ссылка на этот метод.

iformDistr (float); объявлен в заголовке Distribution.h и определен в Distribution.cpp. В опциях моего проекта я установил флаг компоновщика -distributions, а также скомпилировал файл Distribution.cpp, чтобы убедиться, что существует файл Distribution.o для связи.

Отсюда, я не знаю, куда идти, потому что это не решило проблему.

Ответы [ 3 ]

3 голосов
/ 01 мая 2009

Без более точной информации о том, какие команды компилятора / компоновщика были вызваны, и о точных ошибках выдает, трудно дать хороший ответ.

Однако из вашего описания того, что вы сделали, кажется, что вы не передаете distributions.o компоновщику. В отличие от других языков, где компилятор / компоновщик ищет объектные файлы для автоматической ссылки, для компоновщиков C ++ требуется явная спецификация объектов для компоновки.

Вы используете здесь -ldistributions неправильно: флаг -l используется для ссылки на статическую или динамическую библиотеку (соответственно .a и .so файлы в Linux), тогда как вы хотите указать другое объектный файл , который должен учитывать компоновщик. Указание -ldistributions заставляет компоновщик искать distributions.a или distributions.so в стандартных местоположениях библиотеки.

По сути, ваш вызов компоновщика теперь выглядит примерно так (возможно, с большим количеством флагов и библиотек):

gcc -o my_program SharedCache.o -ldistributions

Чтобы правильно связать код дистрибутива, вам нужно, чтобы он выглядел примерно так (опять же, многие флаги и библиотеки, вероятно, отсутствуют по сравнению с реальным):

gcc -o my_program SharedCache.o distributions.o

Это должно решить проблему отсутствующих символов и создать работающий двоичный файл (или, по крайней мере, другую ошибку ;-)). Как это сделать в KDevelop, однако я не знаю.

2 голосов
/ 01 мая 2009

Я не использовал KDevelop, однако в командной строке вы просто добавили бы Distribution.o в качестве входного файла для процесса компоновки. Нет необходимости в тире или в расширении .o.

В качестве альтернативы, вы можете просто добавить дистрибутив.cpp в ваш проект KDevelop? Таким образом, он должен быть скомпилирован и связан автоматически (именно так он работает в таких вещах, как Visual Studio или Eclipse).

0 голосов
/ 01 мая 2009

Вы добавили дистрибутив.cpp в ваш make-файл? Также я считаю, что обязательный флаг компоновщика -ldistributions.

...