选择静态或共享库

本文详细介绍了在CMake中使用静态库和共享库的实践,包括CMakeLists.txt的配置,如设置C++标准、目标编译选项,以及如何处理Windows下的DLL导出。后续还涉及了安装和测试的相关内容。
摘要由CSDN通过智能技术生成

选择静态或共享库


下一篇:练习11 添加导出配置,上一篇:练习9 打包安装程序目录首页

温故知新

经过第一个练习,大家对于基本的使用应该已经掌握了,由于代码过多,在文档中详细介绍太过于啰嗦,大家可以自行下载代码参考

在本节中,我们将展示如何BUILD_SHARED_LIBS变量可用于控制默认行为add_library(),并允许控制如何构建没有显式类型( STATICSHARED或)的库。MODULE``OBJECT

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

  • CMakeLists.txt
option(BUILD_SHARED_LIBS "Build using shared libraries" ON)

接下来,我们需要为静态库和共享库指定输出目录。

  • CMakeLists.txt
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY "${PROJECT_BINARY_DIR}")
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY "${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_CODE构建共享库时SqrtLibrary 的 target 属性True

  • 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}
                        )

定义我们在 Windows 上构建时EXPORTING_MYMATH使用的声明。declspec(dllexport)

  • 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 文档,你能找到一个帮助模块来简化这个过程吗?


下一篇:练习11 添加导出配置,上一篇:练习9 打包安装程序目录首页

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值