C++ 共享库定义和取消定义功能

标签 c++ linux cmake shared-libraries

我对使用共享库的功能的具体包含有疑问。我有自己的小型代码内分析器,我在多个项目中使用它,因此通常将其作为共享库包含在内。最初我想使用编译时标志来关闭分析代码。例如:

#ifdef PROFILEAPP
class Profiler {
   static void start() { ... }
   static void stop() { ... }
};
#else
 class Profiler {
   static void start(){}
   static void stop(){} 
 };

但是,如果事先编译了库而没有定义符号,则这不起作用。请注意,我的库不仅仅是 header 。

所以我发现我可以使用 cmake 命令编译两个不同的目标:

set_property( TARGET my_lib PROPERTY COMPILE_DEFINITIONS "PROFILEAPP")

这确实有效,但我必须更改客户端应用程序中的链接选项,以处理两个不同的 .so 文件。不过,我想知道这是否是正确的出路?像 boost 这样的库在机器差异方面是否做了类似的事情?有什么方法可以通过在客户端应用程序中定义 PROFILEAPP 来完成相同的操作吗?

最佳答案

保留两种不同的构建配置本质上是您唯一能做的事情。最终您会发现为您的应用程序创建多个构建配置可能是最简单的。调试、分析、发布等

关于C++ 共享库定义和取消定义功能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14438891/

相关文章:

c++ - 如何在 C++ 中为数组重载运算符<<?

c++ - 从存储在 std::container 中的结构中提取元素

linux - Linux + NGinx + Kohana + php 上的 URL 区分大小写问题

python - Ansible 不再有效

c++ - Cmake错误: Cannot specify link libraries for target

cmake - 将 C++17 文件系统与 CMake 链接的正确方法是什么?

c++ - 大型二维数组给出段错误

linux - Mint 15 上的 apache2.2 - 被禁止 403

c - 使用 Frama-c 分析带有 CMake 构建基础设施的项目

c++ - 可排序的 std::initializer_list