CMake导入库的行为

18

我在使用CMake的过程中遇到了一个奇怪的问题。

我正在将Curl导入我的项目中,下面是我CMakeLists.txt文件的简化版本。

ADD_LIBRARY (libcurl SHARED IMPORTED)

SET_PROPERTY(TARGET libcurl PROPERTY IMPORTED_LOCATION ../lib/libcurl.lib)

当我运行CMake时,它会为MS VC++(以及Linux)生成项目文件。然后在项目文件中,我发现对curl库的引用有误(libcurl-NOTFOUND)。

如果我将代码更改为静态导入:

ADD_LIBRARY (libcurl STATIC IMPORTED)

SET_PROPERTY(TARGET libcurl PROPERTY IMPORTED_LOCATION ../lib/libcurl.lib)

我就能找到正确的引用 ../lib/libcurl.lib。

你知道这是为什么吗?

非常感谢!


你好,请告诉我问题是如何解决的。我按照下面的评论操作,但导致了更多的错误。 - User001
1个回答

20
对于共享库,IMPORTED_LOCATION 必须指向 DLL 文件,而不是导入库。请参阅 文档。您还可能需要设置 IMPORTED_IMPLIB 属性。
顺便说一下,CMake 还有一个用于 Curl 的 查找包;也许你可以使用它?

1
我已将DLL添加到IMPORTED_LOCATION中。同时,也添加了LIB和IMPORTED_IMPLIB,但这并没有解决共享库链接的错误。 - User001
如果您在add_library中声明库为“SHARED”,那么cmake还需要看到IMPORTED_IMPLIB。Find * .cmake模块中的常见做法似乎是将其声明为“UNKNOWN”以避免出现问题。 - javs
另外,提供给 IMPORTED_LOCATIONpath 必须是一个完整的路径,而不是相对路径。 - Kevin
值得注意的是,cmake关于add_library的文档中没有提到IMPORTED_IMPLIB - RAM
@RAM 零引用通过全名进行。但是它告诉您查看所有 IMPORTED_* 属性以配置目标,并仅提到最重要的一个(并且它确实说它必须指向库文件)。请注意,IMPORTED_IMPLIB 是特定于平台的,就像例如 IMPORTED_SONAME 一样。所有其他 IMPORTED_* 属性可能与给定用例相关或不相关。文档将它们全部指向(如它们所做的)而不是逐个提及它们更有意义。 - Angew is no longer proud of SO
@AngewisnolongerproudofSO提到IMPORTED_*并不代表什么,因为它代表了大约两打不同的变量,其中一些是无关紧要的。将支持Windows库贬低为“特定于平台”也听起来不太对,因为所有库都是特定于平台的,而Windows则是最受欢迎的目标平台之一,如果不是最受欢迎的话。 - RAM

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接