有没有办法自动使库成为静态或动态的?

Posted

技术标签:

【中文标题】有没有办法自动使库成为静态或动态的?【英文标题】:Is there a way to automatically make a library either static or dynamic? 【发布时间】:2009-05-10 17:23:30 【问题描述】:

我知道这可能是一个很长的镜头,但它就是这样。我有几个活动项目,每个项目都有在主项目编译时编译的子项目库。这些库是动态库,但最近出现了一个问题,可能需要这些库(其中大部分在项目之间共享)是静态的而不是动态的。

现在,我很确定有人设计了一个系统,我可以在其中创建一个库,该库可以作为静态编译到项目中,也可以使用诸如简单预处理器指令之类的动态编译到项目中。如果没有,我会梦想成真。

编辑:

看起来可能是 CMake,但是,除了构建东西之外,我还想从我的代码中减轻 __declspec(dllimport) 和 __declspec(dllexport) - 这样我就可以在静态和动态之间自动切换。虽然使用预处理器宏很容易做到,但我想也许有人已经在使用某种形式的系统?

【问题讨论】:

【参考方案1】:

我喜欢使用CMake 来避免这类问题。

【讨论】:

也许您可以解释一下您如何使用 CMake 来避免这些类型的问题? 在 cmake 中,您可以通过仅向 ADD_LIBRARY(, SHARED/STATIC ....) 命令添加/更改一个关键字来将库构建为静态库或共享库。没有别的了。好吧,你必须将lib的构建系统更改为cmake,这应该不会很麻烦。 在习惯了 CMake 之后,我实际上已经开始忘记在 Windows 和 Unix 上构建库等所需的命令行内容。这是一种真正的解脱。【参考方案2】:

如果您希望它是跨平台的,则必须使用 SCons 或 Make 之类的工具,并根据您传入的任何命令变量设置不同的编译器/链接器参数。您必须为每个平台执行此操作和您支持的链接类型组合。

在 Visual Studio 的配置管理器中(您不仅限于发布和调试),然后您可以拥有 ReleaseStatic 和 ReleaseDynamic 以及您可以梦想的任何其他配置。然后,您只需为每个配置设置正确的编译器和链接器开关。

【讨论】:

你发现 gcc 和跨平台标签了吗?【参考方案3】:

下载 cURL 源代码并查看其设置。它可以在Windows中为DLL或静态构建libcurl,在Unix中为静态或共享对象构建libcurl。

【讨论】:

以上是关于有没有办法自动使库成为静态或动态的?的主要内容,如果未能解决你的问题,请参考以下文章

有没有办法在 Laravel 4 中混合静态路由和动态路由?

IDEA新增静态文件如 html 或 jpg 之类文件不自动更新问题

动态变量和静态变量

自动把动态的jsp页面(或静态html)生成PDF文档,并且上传至服务器

静态路由和动态路由的区别

有没有办法从静态方法访问缓存或会话?