从 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 文件构建静态和动态库?