从 Visual studio 个文件构建动态库
Building dynamic library from Visual studio files
我正在为 Python3 编写 C++ 模块。为了让 Python 使用它,我必须将 C++ 源代码构建到动态库中(其中一个要求是 windows- 兼容性)。
源代码已正确编译并与 Cmake 链接(我的 cmake 生成器是 Visual Studio 12 2013 Win64)。但是我必须从 Cmake 文件构建 .dll
文件。如果这里是 Cmake 文件列表:
注意,此列表中没有 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})
鉴于您使用的是 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
标志 - MSVS 生成器不需要它。如果您真的对确保为任何生成器启用 c++XX
标志的正确方法感兴趣,请查看 target_compile_features.
我正在为 Python3 编写 C++ 模块。为了让 Python 使用它,我必须将 C++ 源代码构建到动态库中(其中一个要求是 windows- 兼容性)。
源代码已正确编译并与 Cmake 链接(我的 cmake 生成器是 Visual Studio 12 2013 Win64)。但是我必须从 Cmake 文件构建 .dll
文件。如果这里是 Cmake 文件列表:
注意,此列表中没有 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})
鉴于您使用的是 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
标志 - MSVS 生成器不需要它。如果您真的对确保为任何生成器启用 c++XX
标志的正确方法感兴趣,请查看 target_compile_features.