Принудительное связывание с библиотекой релизов Python в режиме отладки в Windows / Visual Studio из CMake - PullRequest
1 голос
/ 28 июня 2019

Я разрабатываю привязку Python для библиотеки C ++ с использованием Boost Python для Linux и Windows (Visual Studio).

В Windows статическая библиотека Boost Python имеет зависимость от Python (это мотив для другого потока, здесь ), поэтому в моей конфигурации CMake мне нужно сделать:

if((${CMAKE_SYSTEM_NAME} STREQUAL "Linux") OR APPLE)
     target_link_libraries(my_python_module ${Boost_LIBRARIES})
elseif(WIN32 AND MSVC)
    add_definitions(/DBOOST_PYTHON_STATIC_LIB)
    target_link_libraries(my_python_module ${Boost_LIBRARIES}) #This includes the Boost Python library
    # Even though Boost Python library is included statically, in Windows it has a dependency to the Python library.
    target_link_libraries(my_python_module ${Python_LIBRARIES})
endif()

Это прекрасно работает в Linux, но в Windows оно работает только в режиме Release, а не в Debug, и в этом случае я всегда получаю:

LINK : fatal error LNK1104: Can't open file 'python37.lib'

После некоторого растягивания волос я заметил, что проблема была вызвана тем, что CMake приказал Visual Studio связываться с 'python37_d.lib' вместо 'python37.lib' в режиме отладки.

Однако, как я описал в связанной проблеме , официально предоставленная Boost Python debug библиотека связана с Python release библиотека, а не отладочная. Таким образом, решение состоит в том, чтобы принудительно установить связь с библиотекой релизов Python, независимо от типа сборки. К сожалению, ${Python_LIBRARIES} устанавливает библиотеку автоматически в зависимости от режима, и я не хотел бы явно указывать python37.lib в своем коде (так как я могу обновить Python и не хочу, чтобы из-за этого поменяю мои CMake-скрипты)

Я обнаружил некоторые похожие проблемы здесь и здесь , но это не отражает точную ситуацию, с которой я сталкиваюсь. Исходя из этого, я попытался установить:

target_link_libraries(my_python_module optimized ${Python_LIBRARIES})

Но это тоже не сработало. Итак, вопрос:

Есть ли способ принудительно использовать библиотеку релизов Python в режиме отладки? БЕЗ необходимости явно установить его и оставить пакет Python CMake, чтобы сделать это автоматически вместо этого. Под явным я имею в виду делать:

target_link_libraries(my_python_module python37)

Большое спасибо за вашу помощь.

...