Как исправить "NameError name" changePlaying "не определено

Когда компоновщик сталкивается с объектным файлом foo.o во входной последовательности, он безоговорочно связывает его с выходным файлом (программой или разделяемой библиотекой).

Когда он встречает статическую библиотеку, libbar.a , он (по умолчанию) проверяет архив для поиска любых объектных файлов, например libbar.a(foo.o), которые предоставляют определения для неразрешенных символов, на которые ссылаются уже существующие объектные файлы (или разделяемые библиотеки).

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

В вашей первой компиляции и привязке:

$ g++ test.cpp -shared -o libtest-without-static.so

g++ разбивает ее (как он должен) на этапе компиляции и на этапе ссылки эффективно:

    $  g++ -c -o temporary.o test.cpp
    $  g++ temporary.o -shared -o libtest-without-static.so

, в котором temporary.o связано безоговорочно.

В вашей второй ссылке:

$ g++ -shared libtest.a -o libtest-with-static.so

член одиночного архива libtest.a(test.o) не может определить какие-либо неразрешенные ссылки, которые уже были связаны, потому что их нет. libtest.a ничего не способствует связыванию разделяемой библиотеки, а выходная разделяемая библиотека не содержит никаких символов, кроме шаблона, предоставленного библиотеками по умолчанию для ссылки g++ -shared ....

Цель по умолчанию статических библиотек в привязке, в отличие от индивидуально названных объектных файлов, заключается в том, чтобы предложить компоновщику пакет объектных файлов, из которых можно выбрать только те, которые ему нужны, чтобы удовлетворить нерешенные ссылки, уже имеющиеся. Вам не нужно точно знать, какие из них они будут. Вам просто нужно знать, что они в этой сумке. Вы должны связать хотя бы один объектный файл перед любой статической библиотекой, если будут какие-либо нерешенные ссылки, которые могут удовлетворить члены статической библиотеки. Или укажите --whole-archive.

0
задан Mooles 19 January 2019 в 00:45
поделиться

1 ответ

Ввиду аргумента self методов, я вижу, что они находятся в Cog. Вы должны использовать PlayingList в качестве атрибута Cog, то есть в __init__ добавить вместо self.PlayingList = ["Maximus.py.","!help"] и затем обращаться к нему через self. в методах.

И поэтому ответ таков: вы не используете методы правильно. Вы должны сделать self.changePlaying() не changePlaying(self).

Кстати, используйте кортеж вместо списка, если вы не планируете модифицировать его посредством выполнения. И имя переменной не должно начинаться с заглавной буквы, так как оно обычно зарезервировано для классов. См. PEP 8 .

0
ответ дан FrenchMasterSword 19 January 2019 в 00:45
поделиться
Другие вопросы по тегам:

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