неопределенная ссылка на `cudaFree 'и многие другие ошибки при компиляции программы [duplicate]

По вопросу «что мне делать с этим» может быть много ответов.

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

Короче говоря, инварианты класса гарантируют, что в вашем классе будут некоторые ограничения, которые не будут нарушены при нормальном использовании (и, следовательно, класс будет not получить в несогласованном состоянии). Предпосылки означают, что данные, данные как входные данные для функции / метода, должны соответствовать установленным ограничениям и никогда не нарушать их, а постулаты означают, что вывод функции / метода должен соответствовать установленным ограничениям снова не нарушая их. Условия контракта никогда не должны нарушаться во время выполнения программы без ошибок, поэтому дизайн по контракту проверяется на практике в режиме отладки, а отключен в выпусках , чтобы максимизировать развитую производительность системы.

Таким образом, вы можете избежать случаев NullReferenceException, которые являются результатом нарушения установленных ограничений. Например, если вы используете свойство объекта X в классе, а затем попытаетесь вызвать один из его методов, а X имеет нулевое значение, то это приведет к NullReferenceException:

public X { get; set; }

public void InvokeX()
{
    X.DoSomething(); // if X value is null, you will get a NullReferenceException
}

Но если вы установите «свойство X никогда не должно иметь нулевого значения» в качестве предпосылки для метода, вы можете предотвратить описанный ранее сценарий:

//Using code contracts:
[ContractInvariantMethod]
protected void ObjectInvariant () 
{
    Contract.Invariant ( X != null );
    //...
}

По этой причине Код Контракт существует для приложений .NET.

В качестве альтернативы дизайн по контракту может быть применен с использованием утверждений .

ОБНОВЛЕНИЕ: Стоит отметить, что этот термин был придуман Бертраном Майером в связи с его дизайном языка программирования Эйфеля .

4
задан nlucaroni 24 August 2011 в 16:26
поделиться

1 ответ

Ваш порядок ссылок неверен. Свяжите библиотеки после кода, который их требует, а не раньше. Например:

gcc -o eigen eigen.c -llapack 
gcc -static -o eigen eigen.c -llapack

Это должно решить проблемы с привязкой.


Чтобы ответить на следующий вопрос, почему это работает, документация GNU ld говорит об этом:

Имеет значение, где в команде вы пишете эту опцию ; компоновщик ищет и обрабатывает библиотеки и объектные файлы в том порядке, в котором они указаны. Таким образом, foo.o -lz bar.o' searches library z 'после файла foo.o, но до bar.o. Если bar.o ссылается на функции в `z ', эти функции могут не загружаться.

........

Обычно файлы, найденные таким образом, являются библиотечными файлами Архивные файлы, чьи члены являются объектными файлами. Компилятор обрабатывает файл архива, просматривая его для членов, которые определяют символы, которые до сих пор ссылались, но не определялись. Но если найденный файл является обычным объектным файлом, он связан обычным способом.

т.е. компоновщик собирается сделать один проход через файл, ищущий неразрешенные символы, и он следует за файлами в том порядке, в котором вы им предоставляете (т. е. «слева направо»). Если вы еще не указали зависимость при чтении файла, компоновщик не сможет удовлетворить зависимость. Каждый объект в списке ссылок анализируется только один раз.

Обратите внимание, что GNU ld может выполнять переупорядочение в случаях, когда обнаружены циклические зависимости при связывании разделяемых библиотек или объектных файлов. Но статические библиотеки только анализируются только для неизвестных символов.

5
ответ дан talonmies 29 August 2018 в 00:29
поделиться
Другие вопросы по тегам:

Похожие вопросы: