Я разрабатываю привязку 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)
Большое спасибо за вашу помощь.