Обычно каждая единица перевода генерирует объектный файл, содержащий определения символов, определенных в этой единицы перевода. Чтобы использовать эти символы, вам необходимо связать эти объектные файлы.
В разделе gcc вы должны указать все объектные файлы, которые должны быть связаны вместе в командной строке, или скомпилировать файлы реализации вместе.
g++ -o test objectFile1.o objectFile2.o -lLibraryName
Здесь libraryName
- это просто имя библиотеки, без добавления к платформе. Так, например, в файлах библиотеки Linux обычно называют libfoo.so
, но вы должны писать только -lfoo
. В Windows этот же файл можно назвать foo.lib
, но вы будете использовать тот же аргумент. Возможно, вам придется добавить каталог, в котором эти файлы можно найти, используя -L‹directory›
. Обязательно не записывайте пробел после -l
или -L
.
Для XCode: добавьте пути поиска заголовка пользователя -> добавьте путь поиска библиотеки -> перетащите фактическую ссылку библиотеки в
В MSVS файлы, добавленные в проект, автоматически связывают их объектные файлы и генерируется файл lib
(обычно используется). Чтобы использовать символы в отдельном проекте, вам нужно будет добавить файлы lib
в параметры проекта. Это делается в разделе Linker свойств проекта в Input -> Additional Dependencies
. (путь к файлу lib
должен быть добавлен в Linker -> General -> Additional Library Directories
). При использовании сторонней библиотеки, которая предоставляется с файлом lib
, отказ в этом обычно приводит к ошибке.
Также может случиться так, что вы забудете добавить файл в компиляцию, и в этом случае объектный файл не будет сгенерирован. В gcc вы должны добавить файлы в командную строку. В MSVS добавление файла в проект заставит его скомпилировать его автоматически (хотя файлы могут, вручную, быть отдельно исключены из сборки).
В программировании Windows контрольный знак, который вы не связывали необходимая библиотека состоит в том, что имя неразрешенного символа начинается с __imp_
. Посмотрите имя функции в документации, и она должна сказать, какую библиотеку вам нужно использовать. Например, MSDN помещает информацию в поле внизу каждой функции в разделе «Библиотека».
Если вы выполняете app/server.py
в качестве скрипта, родительский каталог app
не добавляется к sys.path()
. Вместо этого добавляется каталог app
(не как пакет, а как путь поиска импорта).
У вас есть 3 варианта:
server.py
out пакета app
(рядом с ним) app
, который работает только: from app import server
server.main()
server.py
до sys.path
: import os.path
import sys
parent = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
sys.path.insert(0, parent)
Этот последний вариант может вызвать больше проблем; теперь как пакет app
, так и модули, содержащиеся в , пакет app
находятся на sys.path
. Вы можете импортировать как app.server
, так и server
, и Python увидит их как два отдельных модуля, каждый со своей собственной записью в sys.modules
, с отдельными копиями своих глобал. нужен __init__.py
файл, будет рассматривать его как пакет
app | --server.py | --global_vars.py | --handlers
| - __init__.py
...
__init__.py
может быть пустым