ошибка компоновщика:неопределенная ссылка на С++

StackOverflow https://stackoverflow.com/questions/809324

Вопрос

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

Я создал проект на 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 )); вызывает функцию, которую я хочу использовать, из другого файла.Ошибка компоновщика — это неопределенная ссылка на этот метод.

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

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

Это было полезно?

Решение

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

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

Другие советы

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

Однако из вашего описания того, что вы сделали, похоже, что вы не проходите 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 я не знаю.

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top