Step 10: Selecting Static or Shared Libraries

谷歌翻译
在本节中,我们将展示BUILD_SHARED_LIBS变量可用于控制add_library(),并允许控制如何构建没有明确类型( STATIC、 SHARED或)MODULE的库。OBJECT

为了实现这一点,我们需要添加BUILD_SHARED_LIBS到顶层CMakeLists.txt。我们使用option()命令,因为它允许用户随意选择值是否应该是ON或OFF。

CMakeLists.txt
option(BUILD_SHARED_LIBS “Build using shared libraries” ON)
接下来,我们需要为静态库和共享库指定输出目录。

CMakeLists.txt
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY “ P R O J E C T B I N A R Y D I R " ) s e t ( C M A K E L I B R A R Y O U T P U T D I R E C T O R Y " {PROJECT_BINARY_DIR}") set(CMAKE_LIBRARY_OUTPUT_DIRECTORY " PROJECTBINARYDIR")set(CMAKELIBRARYOUTPUTDIRECTORY"{PROJECT_BINARY_DIR}”)
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY “${PROJECT_BINARY_DIR}”)

option(BUILD_SHARED_LIBS “Build using shared libraries” ON)
最后,更新MathFunctions/MathFunctions.h以使用 dll 导出定义:

MathFunctions/MathFunctions.h
#if defined(_WIN32)

if defined(EXPORTING_MYMATH)

define DECLSPEC __declspec(dllexport)

else

define DECLSPEC __declspec(dllimport)

endif

#else // non windows

define DECLSPEC

#endif

namespace mathfunctions {
double DECLSPEC sqrt(double x);
}
此时,如果您构建了所有内容,您可能会注意到链接失败,因为我们正在将没有位置独立代码的静态库与具有位置独立代码的库组合在一起。 解决方案是明确设置POSITION_INDEPENDENT_CODETrue在构建共享库时,SqrtLibrary 的目标属性。

MathFunctions/CMakeLists.txt

state that SqrtLibrary need PIC when the default is shared libraries

set_target_properties(SqrtLibrary PROPERTIES
POSITION_INDEPENDENT_CODE ${BUILD_SHARED_LIBS}
)
定义EXPORTING_MYMATH说明我们declspec(dllexport)在 Windows 上构建时使用的内容。

MathFunctions/CMakeLists.txt

define the symbol stating we are using the declspec(dllexport) when

building on windows

target_compile_definitions(MathFunctions PRIVATE “EXPORTING_MYMATH”)
练习:我们进行了修改MathFunctions.h以使用 dll 导出定义。使用 CMake 文档,您能找到一个辅助模块来简化这一过程吗?

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值