CMAKE 共享库仅创建 DLL,而不创建关联的 LIB

问题描述 投票:0回答:2

我正在使用 CMAKE 为 Visual Studio 配置我的项目,并且我有以下设置:

PROJECT(Proj1)
CMAKE_MINIMUM_REQUIRED(VERSION 3.2.0)
# RPATH stuff - to avoid losing linking information
SET(CMAKE_SKIP_BUILD_RPATH FALSE)
SET(CMAKE_BUILD_WITH_INSTALL_RPATH FALSE)
SET(CMAKE_INSTALL_RPATH "${CMAKE_INSTALL_PREFIX}/lib")
SET(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE)


# Variable for header and source files
SET(HEADERS
  api/mylib.h   
)
SET(SOURCES
  api/mylib.cpp
)

# Compile and link
ADD_LIBRARY(${NAME} SHARED ${HEADERS} ${SOURCES})
TARGET_LINK_LIBRARIES(${NAME} ${LIBS})

现在,这创建了项目,我可以编译它,但它只生成

Proj1.dll
文件,而不是 associatwed
lib
文件。我认为库和共享对象文件都应该已生成。

我正在使用

CMAKE 3.11.0
Visual Studio Community 2017

cmake
2个回答
0
投票

如果你放

set( CMAKE_WINDOWS_EXPORT_ALL_SYMBOLS True )

在顶级 CMakeLists 文件的前面,项目内构建的所有共享库中的所有符号*都将自动导出。这使您无需通过

__declspec(dllexport)
手动导出每个符号。

*除全局 data 符号之外的所有符号,我找不到简单的修复方法。

来自 CMake 文档:

WINDOWS_EXPORT_ALL_SYMBOLS

启用此布尔属性可自动创建模块定义 (

.def
) 文件,其中包含 Windows 上
.obj
库(或使用
SHARED
执行的可执行文件)的输入
ENABLE_EXPORTS
文件中找到的所有全局符号。模块定义文件将传递给链接器,导致所有符号从
.dll
导出。对于全局 data 符号,在针对
__declspec(dllimport)
中的代码进行编译时仍必须使用
.dll
。所有其他函数符号将由调用者自动导出和导入。这减少了对显式
dllexport
标记的需求,从而简化了将项目移植到 Windows,即使在
C++
类中也是如此。

...

如果在创建目标时设置了该属性,则该属性由

CMAKE_WINDOWS_EXPORT_ALL_SYMBOLS
变量的值初始化。


-8
投票

要创建静态库.lib,您必须使用STATIC关键字而不是SHARED

ADD_LIBRARY(${NAME} STATIC ${HEADERS} ${SOURCES})

看一下: https://cmake.org/cmake/help/v3.0/command/add_library.html

© www.soinside.com 2019 - 2024. All rights reserved.