pybind module.obj: ошибка LNK2001: неразрешенный внешний символ - PullRequest
3 голосов
/ 19 января 2020

, когда я запускаю pip install . в каталоге, где у меня есть файл setup.py. Я использую pybind11 для создания модуля python для моего проекта C ++. (также на windows 10)

Я получаю эту ошибку: https://pastebin.com/xGyFQQk2

Вот модуль. cpp код:

Environment pyInitEnvironment(const py::list& pyList, const unsigned int allowedLayers, const unsigned int padding, const unsigned int maxTracersPerGroup) {
    return Environment(listToContactVertexGroup(pyList), allowedLayers, padding, maxTracersPerGroup);
}

PYBIND11_MODULE(route_search_superfast, m) {
    py::class_<Environment>(m, "Environment")
        .def(py::init(&pyInitEnvironment));

    py::class_<RandomModel>(m, "RandomModel");
}

А вот мои setup.py:

import os, sys

from distutils.core import setup, Extension
from distutils import sysconfig

cpp_args = ['-std=c++11', '-stdlib=libc++', '-mmacosx-version-min=10.7']

rss_module = Extension(
    'route_search_superfast', 
    sources=['module.cpp'],
    include_dirs=['pybind11/include'],
    language='c++',
    extra_compile_args = cpp_args,
)

setup(
    name = 'route_search_superfast',
    version = '1.0',
    description = 'Python package with superfastcode2 C++ extension (PyBind11)',
    ext_modules = [rss_module],
)

Единственное, что не хочет создавать, это мои файлы Environment.h & Environment. cpp. Они довольно длинные, но я могу заверить вас, что Visual Studio их создает. Все отлично работает. Я даже могу сгенерировать выходной файл .pyd и импортировать его в python, и он будет работать все. Тем не менее, когда я пытаюсь заставить сценарий установки собрать проект C ++, он выбрасывает этот консольный стек (снова, найденный здесь: https://pastebin.com/xGyFQQk2)

Так как файл .pyd работает (снова Я могу импортировать это в python и все работает отлично) Есть ли способ, которым я могу использовать distutils, чтобы просто использовать .pyd при локальной установке пакета?

1 Ответ

0 голосов
/ 26 января 2020

Компиляция C ++ включает три этапа. В первой предварительной обработке обрабатываются макросы #include. На этом этапе компилятор будет искать заголовочные файлы в include_dirs. Во второй части компиляции создаются объектные файлы, а в третьей части (связывание) они связаны между собой. Смотрите здесь для более подробной информации.

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

Попробуйте добавить эти две строки в определение rss_module

libraries = ['...'], library_dirs = ['...']

См. Это руководство, в котором показан аналогичный пример того, как связать внешнюю библиотеку с приложением https://docs.microsoft.com/en-us/cpp/build/walkthrough-creating-and-using-a-dynamic-link-library-cpp?view=vs-2019

...