我正在使用 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
如果你放
set( CMAKE_WINDOWS_EXPORT_ALL_SYMBOLS True )
在顶级 CMakeLists 文件的前面,项目内构建的所有共享库中的所有符号*都将自动导出。这使您无需通过
__declspec(dllexport)
手动导出每个符号。
*除全局 data 符号之外的所有符号,我找不到简单的修复方法。
WINDOWS_EXPORT_ALL_SYMBOLS
启用此布尔属性可自动创建模块定义 (
) 文件,其中包含 Windows 上.def
库(或使用.obj
执行的可执行文件)的输入SHARED
文件中找到的所有全局符号。模块定义文件将传递给链接器,导致所有符号从ENABLE_EXPORTS
导出。对于全局 data 符号,在针对.dll
中的代码进行编译时仍必须使用__declspec(dllimport)
。所有其他函数符号将由调用者自动导出和导入。这减少了对显式.dll
标记的需求,从而简化了将项目移植到 Windows,即使在dllexport
类中也是如此。C++
...
如果在创建目标时设置了该属性,则该属性由
变量的值初始化。CMAKE_WINDOWS_EXPORT_ALL_SYMBOLS
要创建静态库.lib,您必须使用STATIC关键字而不是SHARED
ADD_LIBRARY(${NAME} STATIC ${HEADERS} ${SOURCES})
看一下: https://cmake.org/cmake/help/v3.0/command/add_library.html