CMake ADD_LIBRARY INTERFACE 替代方案

3

我正在尝试使用一个仅包含头文件的库(thread-pool)作为子项目。因此,在根CMakeLists.txt中,我有以下内容:

ADD_SUBDIRECTORY(thread_pool)

thread-pool/CMakeLists.txt 内部

CMAKE_MINIMUM_REQUIRED(VERSION 2.6)
PROJECT(thread-pool)

SET(THREAD_POOL_SOURCES)

ADD_LIBRARY(thread-pool STATIC ${THREAD_POOL_SOURCES})

由于这是一个仅有头文件而没有源代码的库,因此会出现错误。
引用: CMake 错误:CMake 无法确定目标的链接器语言:thread-pool
其中一种解决方案是使用ADD_LIBRARY(thread-pool INTERFACE),但这只适用于CMake 3.0,而我安装的是2.8。我不是在寻求如何将CMake升级到3.0的解决方案,而是想知道是否有其他方法可以在CMake 2.6或2.8中使用?
我想到的一种方法是创建一个虚拟cpp文件,其中包含一些虚拟函数,并将其放入源文件中,但这将是一个糟糕的解决方案。

1
不要将CMake版本号像2.6、2.8、3.0这样计算。它更像是2.6、2.8.0、2.8.1,...,2.8.12、3.0。他们改变了版本号的方案。在2.8.x和2.8.x+1之间,每个x都增加了几个功能。其中x为0到11。 - usr1234567
2个回答

1
针对您的原始问题,请尝试使用以下内容:

set_target_properties(thread-pool PROPERTIES LINKER_LANGUAGE CXX)

它不需要源代码即可工作。我已经在低至2.8.10版本上测试过这种方法。我想这种方法可能无法在2.6上运行,但考虑到它已经有6年历史了,你的情况可能会有所不同。 - StAlphonzo

0
假设您已经在源目录的thread-pool子目录中解压了库,并且您的项目结构类似于这样:
(root)
 |-- thread-pool
 |   +-- boost
 |       +-- threadpool.hpp
 |-- subproject_A
 |   +-- test.cpp
 +-- CMakeLists.txt

你只需要在根目录下的CMakeLists.txt文件中进行操作:

include_directories(thread-pool)
...
add_subdirectory(subproject_A)    

为了获得对库的访问权限。然后在test.cpp中,你只需要使用#include "boost/threadpool.hpp"而不需要相对路径。

add_library仅适用于具有编译组件的库,因此不要使用它。


但这要求我为所有其他使用线程池的子项目添加相对路径。我不能只是说包含线程池以自动解决路径。 - Neel Basu
不需要添加相对路径,因为cmake会在你添加的子目录中搜索包含文件。请参考我的更新答案。这是您打算使用项目的方式吗? - atsui

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