Почему статическая версия библиотеки Boost Python зависит от Python в Windows? - PullRequest
1 голос
/ 27 июня 2019

Я разрабатываю привязку Python для библиотеки C ++ с использованием Boost Python. Чтобы избежать проблем с распространением библиотек Boost, я использую статические версии. Он прекрасно работает в Linux и MacOSX, но в Windows все еще требуется зависимость от Python. Мой CMakeLists.txt установлен как:

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) # This is also required to force the usage of libboost_python37-vc141-mt-x64-1_70.lib instead of boost_python37-vc141-mt-x64-1_70.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()

Таким образом, потому что в Windows, если я удаляю строку target_link_libraries(my_python_module ${Python_LIBRARIES}), я получаю:

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

Моя результирующая DLL действительно имеет зависимость Python:

C:\PythonModule\bin\Release\Release>"C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.16.27023\bin\Hostx64\x64\dumpbin.exe" /DEPENDENTS my_python_module.dll
Microsoft (R) COFF/PE Dumper Version 14.16.27031.1
Copyright (C) Microsoft Corporation.  All rights reserved.


Dump of file my_python_module.dll

File Type: DLL

  Image has the following dependencies:

    python37.dll <------- HERE
    MSVCP140.dll
    VCRUNTIME140.dll
    api-ms-win-crt-runtime-l1-1-0.dll
    api-ms-win-crt-heap-l1-1-0.dll
    KERNEL32.dll

  Summary

        B000 .data
        3000 .pdata
       18000 .rdata
        1000 .reloc
        1000 .rsrc
       27000 .text

Поскольку я использую статические библиотеки Boost, процесс связывается с libboost_python37-vc141-mt-x64-1_70.lib, а не boost_python37-vc141-mt-x64-1_70.lib (который является библиотечным модулем, связанным с динамической библиотекой, boost_python37-vc141-mt-x64-1_70.dll). Я могу проверить это в командной строке, переданной в Visual Studio (спасибо -DCMAKE_VERBOSE_MAKEFILE:BOOL=ON):

Link:
  C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.16.27023\bin\HostX86\x64\link.exe /ERRORREPORT:QUEUE /OUT:"C:\PythonModule\bin\Release\Release\my_python_module.dll" /INCREMENTAL:NO /NOLOGO "C:\local\boost_1_70_0\lib64-msvc-14.1\libboost_filesystem-vc141-mt-x64-1_70.lib"
  "C:\local\boost_1_70_0\lib64-msvc-14.1\libboost_program_options-vc141-mt-x64-1_70.lib"
  "C:\local\boost_1_70_0\lib64-msvc-14.1\libboost_python37-vc141-mt-x64-1_70.lib"  <------- HERE
  "C:\local\boost_1_70_0\lib64-msvc-14.1\libboost_thread-vc141-mt-x64-1_70.lib"
  "C:\local\boost_1_70_0\lib64-msvc-14.1\libboost_system-vc141-mt-x64-1_70.lib"
  "C:\local\boost_1_70_0\lib64-msvc-14.1\libboost_stacktrace_windbg-vc141-mt-x64-1_70.lib"
  "C:\local\boost_1_70_0\lib64-msvc-14.1\libboost_chrono-vc141-mt-x64-1_70.lib"
  "C:\local\boost_1_70_0\lib64-msvc-14.1\libboost_date_time-vc141-mt-x64-1_70.lib"
  "C:\local\boost_1_70_0\lib64-msvc-14.1\libboost_atomic-vc141-mt-x64-1_70.lib"
  "C:\Program Files\Python37\libs\python37.lib"
  kernel32.lib user32.lib gdi32.lib winspool.lib shell32.lib ole32.lib oleaut32.lib uuid.lib comdlg32.lib advapi32.lib /MANIFEST /MANIFESTUAC:"level='asInvoker' uiAccess='false'" /manifest:embed /PDB:"C:/PythonModule/lib/Release/Release/my_python_module.pdb" /SUBSYSTEM:CONSOLE /TLBID:1 /DYNAMICBASE /NXCOMPAT /IMPLIB:"C:/PythonModule/lib/Release/Release/my_python_module.lib" /MACHINE:X64  /machine:x64 /IGNORE:4049,4217 /DLL my_python_module.dir\Release\my_python_module.obj
     Creating library C:/PythonModule/lib/Release/Release/my_python_module.lib and object C:/PythonModule/lib/Release/Release/my_python_module.exp
  my_python_module.vcxproj -> C:\PythonModule\bin\Release\Release\my_python_module.dll

Кстати, это официальные двоичные файлы Boost, кстати, полученные из https://dl.bintray.com/boostorg/release/1.70.0/binaries/boost_1_70_0-msvc-14.1-64.exe

Статическая библиотека Python Boost, насколько я могу проверить, не имеет зависимости от Python:

C:\local\boost_1_70_0\lib64-msvc-14.1>"C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.16.27023\bin\Hostx64\x64\dumpbin.exe" /DEPENDENTS libboost_python37-vc141-mt-x64-1_70.lib
Microsoft (R) COFF/PE Dumper Version 14.16.27031.1
Copyright (C) Microsoft Corporation.  All rights reserved.

Dump of file libboost_python37-vc141-mt-x64-1_70.lib

File Type: LIBRARY

  Summary

         100 .CRT$XCU
         35A .bss
       17EF8 .chks64
         DD0 .data
         CFE .data$r
        1804 .debug$S
        23B5 .drectve
        5B20 .pdata
        9FD3 .rdata
         EF8 .rdata$r
         4DB .text$di
       32D89 .text$mn
        3F59 .text$x
         608 .text$yd
       11C10 .xdata
         4C0 .xdata$x

Пока общий делает:

C:\local\boost_1_70_0\lib64-msvc-14.1>"C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.16.27023\bin\Hostx64\x64\dumpbin.exe" /DEPENDENTS boost_python37-vc141-mt-x64-1_70.dll
Microsoft (R) COFF/PE Dumper Version 14.16.27031.1
Copyright (C) Microsoft Corporation.  All rights reserved.

Dump of file boost_python37-vc141-mt-x64-1_70.dll

File Type: DLL

  Image has the following dependencies:

    python37.dll <------- HERE
    MSVCP140.dll
    KERNEL32.dll
    VCRUNTIME140.dll
    api-ms-win-crt-runtime-l1-1-0.dll
    api-ms-win-crt-heap-l1-1-0.dll

  Summary

        3000 .data
        3000 .pdata
       18000 .rdata
        1000 .reloc
        1000 .rsrc
       1D000 .text

Итак, мой главный вопрос:

Почему, если я использую статическую версию библиотеки Boost Python, у меня все еще есть эта зависимость Python?

Я не использую Python напрямую в модуле иным способом, а в Linux такой зависимости не существует.

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

...