将.cmake文件中的源文件包含到CMakeList.txt中的正确方法

问题描述:

我遇到以下CMake问题。将.cmake文件中的源文件包含到CMakeList.txt中的正确方法

我的项目的结构是:

Project 
--- libs 
------ lib1 
---------CmakeLists.txt 
------ lib2 
---------lib2.cmake 
---------file1.c 
---------file2.c 
--- src 
... 

在我lib2.cmake我:

set(LIB2_SOURCES 
     file1.c 
     file2.c 
     ) 

而且我想在我的LIB1 CMakeList.txt使用${LIB2_SOURCES}

include(../lib2/lib2.cmake) 
set(LIB1_SOURCES 
     .... 
     ) 

add_library(media SHARED ${LIB1_SOURCES} ${LIB2_SOURCES}) 

但我收到这个错误:

Cannot find source file: 
file1.c 

如果我改变我的lib2.cmake和修复这样的路径:

set(LIB2_SOURCES 
     ../lib2/file1.c 
     ../lib2/file2.c 
     ) 

它的工作原理。但这对我来说不是一个好方法。

我可以将lib2.cmake移动到lib1目录中,但这对我来说也不是一个好方法。

那么,处理这个问题的正确方法是什么?有什么办法可以包含lib2.cmake而不会丢失路径?

如果你想拥有不依赖于当前的目录路径,使用绝对路径:

set(LIB2_SOURCES 
     ${CMAKE_CURRENT_LIST_DIR}/file1.c 
     ${CMAKE_CURRENT_LIST_DIR}/file2.c 
) 

CMAKE_CURRENT_LIST_DIR是包含CMake的文件目前正在处理(这将是你的情况时Project/libs/lib2目录处理lib2.cmake)。

但是,而不是定义这样的来源,你可能也想看看给lib2适当CMakeLists.txt,并在其中定义object library,然后补充说,对象库为media库。

+0

谢谢@Angew。多数民众赞成我正在寻找。我知道如何完成图书馆的工作,但是在这个项目中,我必须在lib1内建立lib2。 – DustBG

+1

@DustBG CMake对象库不是一般意义上的库。这只是CMake的一个目标文件集合的名称,它将链接到您指定的任何目标。我不知道你的需求的细节,但是对象库通常非常接近“直接在消费二进制内部构建源代码”。 – Angew

+0

是的,我知道你是什么意思,但在我的情况下,最好使用$ {CMAKE_CURRENT_LIST_DIR}。 – DustBG