将.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
库。
谢谢@Angew。多数民众赞成我正在寻找。我知道如何完成图书馆的工作,但是在这个项目中,我必须在lib1内建立lib2。 – DustBG
@DustBG CMake对象库不是一般意义上的库。这只是CMake的一个目标文件集合的名称,它将链接到您指定的任何目标。我不知道你的需求的细节,但是对象库通常非常接近“直接在消费二进制内部构建源代码”。 – Angew
是的,我知道你是什么意思,但在我的情况下,最好使用$ {CMAKE_CURRENT_LIST_DIR}。 – DustBG