Сборка динамической библиотеки из файлов Visual Studio

Я пишу модуль С++ для Python3. Чтобы заставить Python работать с ним, мне нужно собрать исходный код C++ в динамическую библиотеку (одно из требований — совместимость с Windows).

Исходный код правильно скомпилирован и слинкован с Cmake (мой генератор cmake — Visual Studio 12 2013 Win64). Но тогда мне нужно собрать файл .dll из файлов Cmake. Список файлов Cmake, если здесь: введите здесь описание изображения

Обратите внимание, в этом списке нет файла Makefile!

Как я могу собрать .dll из этих файлов? Я пробовал MinGW и GNUwin32, но они не работали.

Мой CMakeLists.txt ниже:

cmake_minimum_required(VERSION 3.2)
set(CMAKE_VERBOSE_MAKEFILES on)
project(Proj)
set(SOURCE_FILES repeating_count.cpp)

set(BUILD_SHARED_LIBS ON)

set(CMAKE_VERBOSE_MAKEFILE on)
find_package(PythonLibs 3.4 REQUIRED)
include_directories(${PYTHON_INCLUDE_DIRS})
python_add_module(repeating_count repeating_count.cpp)

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")
add_executable(Proj ${SOURCE_FILES})
target_link_libraries(Proj ${PYTHON_LIBRARIES})

person VeLKerr    schedule 14.09.2015    source источник
comment
Note, there isn't Makefile in this list! В Visual Studio не должно быть make-файла. У вас есть все необходимое для сборки в ide. Вы даже можете открыть командную строку Visual Studio и выполнить cmake --build . из папки, содержащей файл .sln, или использовать msbuild.   -  person drescherjm    schedule 14.09.2015
comment
@drescherjm, хорошо, я использовал командную строку VS и поймал ошибку: LINK : fatal error LNK1104: cannot open file 'python34_d.lib' [D:\VeLKerr\Docum ents\proglangs\Build\repeating_count.vcxproj]   -  person VeLKerr    schedule 14.09.2015
comment
@VeLKerr Я полагаю, что комментарий не был связан с вашей реальной проблемой. Ошибка, которую вы видите, связана с тем, что по умолчанию для VS cmake --build . создается отладочная версия. Вам нужно запустить cmake --build . --config Release, чтобы собрать релизную версию.   -  person Rostislav    schedule 14.09.2015
comment
@Rostislav, я пытался собрать выпуск вместо отладки, но получил только python34.lib вместо python34_d.lib в сообщении об ошибке. У меня есть оба, python34.lib и python34_d.lib на моем ПК.   -  person VeLKerr    schedule 14.09.2015
comment
@VeLKerr По-видимому, в вашем CMakeLists.txt кое-что отсутствует. Увидев это, можно было бы понять это.   -  person Rostislav    schedule 14.09.2015
comment
@Rostislav, я обновил свои сообщения с помощью CMakeLists.txt (в этом файле я также учел ваш ответ).   -  person VeLKerr    schedule 14.09.2015
comment
Ну, пара вещей. VS не имеет флага -std=c++11. Он будет собран со всеми доступными функциями по умолчанию (если вы используете VS2015, он будет иметь почти все С++ 14 и некоторые С++ 17). Глядя на документы Python, кажется, что вам просто нужно создать dll. Я отредактирую свой ответ так, как, по моему мнению, должны выглядеть ваши CMakeLists.   -  person Rostislav    schedule 14.09.2015


Ответы (1)


Учитывая, что вы используете CMake, вы можете добиться этого, добавив

set(BUILD_SHARED_LIBS ON)

прежде чем вы определите свои библиотеки (возможно, просто в начале вашего CMakeLists.txt). См. документацию по этому флагу здесь.

Кроме того, вы можете напрямую принудительно предоставить общий доступ к библиотеке, добавив флаг SHARED к себе add_library:

add_library(myLibrary SHARED ${sources})

См. документацию по этому вопросу здесь.

Ваши измененные CMakeLists должны выглядеть так:

cmake_minimum_required(VERSION 3.2)

set(CMAKE_VERBOSE_MAKEFILES on)
project(Proj)
set(SOURCE_FILES repeating_count.cpp)

set(BUILD_SHARED_LIBS ON)

# Find PythonLibs
find_package(PythonLibs 3.4 REQUIRED)
include_directories(${PYTHON_INCLUDE_DIRS})

# This will create the Proj.dll
add_library(Proj ${SOURCE_FILES})
target_link_libraries(Proj ${PYTHON_LIBRARIES})

Что касается флага -std=c++11 - он вам не нужен для генератора MSVS. Если вас действительно интересует, как правильно включить флаги c++XX для любого генератора, взгляните на target_compile_features.

person Rostislav    schedule 14.09.2015
comment
Я редактировал CMakeLists.txt (см. его в конце моего поста), но сборка завершается с ошибкой: LINK : fatal error LNK1104: cannot open file 'python34.lib' - person VeLKerr; 14.09.2015