从 Visual Studio 文件构建动态库

Posted

技术标签:

【中文标题】从 Visual Studio 文件构建动态库【英文标题】:Building dynamic library from Visual studio files 【发布时间】:2015-09-14 12:54:57 【问题描述】:

我正在为 Python3 编写一个 C++ 模块。为了让 Python 使用它,我必须将 C++ 源代码构建到动态库中(要求之一是 windows 兼容性)。

源代码已正确编译并与 Cmake 链接(我的 cmake 生成器是 Visual Studio 12 2013 Win64)。但是我必须从 Cmake 文件构建 .dll 文件。 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)

【问题讨论】:

Note, there isn't Makefile in this list! Visual Studio 上不应该有生成文件。您拥有在 ide 中构建所需的一切。您甚至可以打开 Visual Studio 命令提示符并从包含 .sln 文件的文件夹中执行 cmake --build . 或使用 msbuild。 @drescherjm,好的,我使用 VS 命令提示符并发现错误:LINK : fatal error LNK1104: cannot open file 'python34_d.lib' [D:\VeLKerr\Docum ents\proglangs\Build\repeating_count.vcxproj] @VeLKerr 我相信该评论与您的​​实际问题无关。您看到的错误来自于默认情况下 VS cmake --build . 将构建调试版本。您需要运行cmake --build . --config Release 来构建发布版本。 @VeLKerr 显然,您的 CMakeLists.txt 缺少一些东西。看到它有助于弄清楚这一点。 嗯,有几件事。 VS 没有标志“-std=c++11”。默认情况下,它将使用所有可用功能构建(如果您使用的是 VS2015,它将具有几乎所有 C++14 和一些 C++17)。查看 python 的文档,您似乎只需要制作一个 dll。我会用我认为你的 CMakeLists 应该是什么样子来编辑我的答案 【参考方案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 标志 - MSVS 生成器不需要它。如果您真的对确保为任何生成器启用c++XX 标志的正确方法感兴趣,请查看target_compile_features。

【讨论】:

我编辑了 CMakeLists.txt(请参阅我的帖子末尾),但构建失败并出现错误:LINK : fatal error LNK1104: cannot open file 'python34.lib'

以上是关于从 Visual Studio 文件构建动态库的主要内容,如果未能解决你的问题,请参考以下文章

将 Eigen 与 Visual Studio 2013 的动态库一起使用的内存对齐错误

动态链接库在编译时不生成 .lib 文件(Visual Studio C++ Express)

如何从 Visual C++ 的 .obj 文件构建静态和动态库?

visual studio 2008 c++ 中怎样添加动态链接库?

visual studio 如何生成动态库

如何使用 gcc 和 Visual Studio 的“静态链接”和“动态链接”构建 C/C++ 程序?