【问题标题】:Link poco static library to target in cmake将 poco 静态库链接到 cmake 中的目标
【发布时间】:2015-01-14 22:06:11
【问题描述】:

我阅读了很多帖子,但我还不太了解如何将我的目标链接到库的静态版本。

我的项目依赖于 poco 库,而在 linux 中,它们存储在 /usr/local/lib 中(静态和共享版本)在我的 windows 机器中位于 d:\libs\poco\lib 和 d:\ libs\poco\bin(我有一个名为 POCO_DIR = D:\libs\poco 的环境变量)

那么,我该如何在 cmake 文件中编写 find_library() 指令呢?

提前致谢。

【问题讨论】:

    标签: c++ cmake poco-libraries


    【解决方案1】:

    您永远不会在 Windows 上链接 Poco DLL,即使您使用共享的 Poco 库也是如此。链接始终使用 %POCO_BASE%/lib 中的条目。对于共享构建,.lib 只是一个存根(“导入库”),负责在运行时加载 DLL。有关其工作原理的详细信息,请参阅Linking Implicitly

    Poco 静态库可以通过文件名与 DLL 的导入库区分开来 - 静态库有“mt”(“mtd”用于调试二进制文件,“md”和“mdd”在使用运行时库 DLL 时)附加到名字。因此 PocoFoundation.dll 的导入库将命名为 PocoFoundation.lib,而使用静态运行时的静态库命名为 PocoFoundationmt.lib。使用动态运行时的静态库是 PocoFoundationmd.lib。详情请见Use Run-Time Library

    至于 CMake,我不是专家,但对于例如静态 Foundation 和 Net 库应该是这样的:

    FIND_LIBRARY(Poco_LIBRARIES NAMES PocoFoundationmt PocoNetmt PATH_SUFFIXES ${POCO_DIR}/lib)
    

    编辑:如果您在项目中定义 POCO_STATIC,静态链接将通过库头自动进行,请参见例如Foundation.h

    【讨论】:

    • 嗨,亚历克斯,感谢您的回复。我知道链接是如何工作的 :) 我的疑问只是我必须在 FIND_LIBRARY() 中使用哪个名称。如果在 Windows 中有用于区分各种构建的后缀,则在 Linux 中只有扩展名(.a 或 .so)。所以如果我写“PocoFoundationmt”可能只对 Windows 有效。我问自己有没有办法为每个系统使用相同的指令。
    • 使用 if(WIN32) 检测操作系统。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-10-08
    • 2021-10-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多