gpt4 book ai didi

c++ - CMake 和#pragma comment(lib)

转载 作者:可可西里 更新时间:2023-11-01 11:44:46 27 4
gpt4 key购买 nike

对于我的 CMake 项目,我有一个外部库,由一个头文件和几个 .lib/.dll 对组成。

头文件有选择地链接到 .lib/.dll 对之一,举个例子:

#ifdef DEBUG
#pragma comment(lib "exampled.lib")
#elif
#pragma comment(lib "example.lib")
#endif

完整来说,有一个 .lib 和匹配的 .dll 用于 32/64 位和调试/发布,所以总共有 4 对。头文件内部是正确的 #ifdef - 链接正确库的逻辑。正如我所说,它是一个外部库,所以我不想更改该 header 。

向 CMake 教授此内容的正确方法是什么?

对于编译时间(即包含目录),我可以使用 target_include_directories(),效果很好。我还可以创建一个带有接口(interface)包含目录的导入目标,这也可以正常工作。

问题始于链接时:

  • target_link_libraries() 强制我指定其中一个 .lib/.dll 文件。我可以复制 #ifdef 逻辑,但这感觉不对。添加所有文件也不正确,因为总是只需要一个文件。
  • 导入的目标也允许我添加 .dll 和 .lib 文件,但同样,我要么必须复制逻辑,要么链接所有库。
  • link_directories() 在全局范围内工作。如果只有少数目标确实需要它,那感觉就没必要了。
  • 将给定目录添加到 PATH 似乎也是“全局的”,即因为库当前与代码一起分发。

所以我正在寻找类似 target_link_directories() 或类似的解决方案。显然,要在运行时实际加载 .dll,我必须采取进一步的步骤,因此如果您的解决方案包含此内容,我们将非常欢迎。

最佳答案

target_link_libraries() forces me to specify one of the .lib/.dll files

这不是真的。您可以提供关键字来指示库属于哪种构建类型。

来自 target_link_libraries 上的 CMake 文档

A debug, optimized, or general keyword indicates that the library immediately following it is to be used only for the corresponding build configuration. The debug keyword corresponds to the Debug configuration (or to configurations named in the DEBUG_CONFIGURATIONS global property if it is set)

示例:target_link_libraries( my_target optimized example.lib debug exampled.lib

这由 CMAKE_BUILD_TYPE 变量控制。参见 the cmake documentation有关此变量的更多信息

至于 32 位与 64 位,您需要添加 if block 来检查架构,我承认这是一个限制。

关于c++ - CMake 和#pragma comment(lib),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48232003/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com