2015-09-14 7 views
1

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

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

Примечание: в этом списке нет Makefile!

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

Мои 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}) 
+1

'Обратите внимание, что в этом списке нет Makefile!' В visual studio не должно быть make-файла. У вас есть все, что нужно, чтобы построить идеал. Вы даже можете открыть командную строку визуальной студии и сделать 'cmake --build .' из папки, содержащей файл .sln, или использовать msbuild. – drescherjm

+0

@drescherjm, ok, я использовал VS command promt и поймал ошибку: 'LINK: фатальная ошибка LNK1104: не могу открыть файл 'python34_d.lib' [D: \ VeLKerr \ Docum ents \ proglangs \ Build \ repeatating_count.vcxproj]' – VeLKerr

+1

@VeLKerr Я считаю, что комментарий не был связан с вашей реальной проблемой. Ошибка, которую вы видите, исходит из того, что по умолчанию для VS 'cmake --build .' будет создана версия отладки. Вам нужно запустить 'cmake --build. --config Release', чтобы изменить версию выпуска. – Rostislav

ответ

1

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

set(BUILD_SHARED_LIBS ON) 

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

В качестве альтернативы, вы можете непосредственно заставить библиотеку для совместного использования путем добавления SHARED флага вам add_library:

add_library(myLibrary SHARED ${sources}) 

Обратитесь к документации по этим here.

Ваши модифицированные 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 флага - вам не нужно, что для генератора МСВС. Если вас действительно интересует правильный способ гарантировать, что флажки c++XX включены для любого генератора, взгляните на target_compile_features.

+0

Я редактировал CMakeLists.txt (см. его в конце моего сообщения), но сбой сборки с ошибкой: 'LINK: фатальная ошибка LNK1104: невозможно открыть файл 'python34.lib'' – VeLKerr

Смежные вопросы