我有一个 cmake 项目,其中有一些模块,我正在使用 Find-*.cmake 将共享模块包含在应用程序中。为了不考虑我添加的每个模块,我LIB
为链接器定义了一种全局变量:
# inside a Find-*.cmake or in the CMakeLists.txt of the modules:
set(LIB ${LIB} ...)
因此,在使用某些模块的最终应用程序之一中,我可以这样做:
target_link_libraries(${APP_NAME} ${LIB})
然后,我希望将已编译的模块放入其中,/project_path/modules/foo/build
这样如果一个模块真的很大,无法编译,则可以为所有使用它的应用程序编译一次。我实现这一点的方法是以这种方式从 Find-*.cmake 加载模块的 CMakeLists.txt :
# Inside FindFoo.cmake, for loading /project_path/modules/foo/CMakeLists.txt
# and compile it in /project_path/modules/foo/build
add_subdirectory(${CMAKE_CURRENT_LIST_DIR}/../modules/${PACKAGE_NAME}
${CMAKE_CURRENT_LIST_DIR}/../modules/${PACKAGE_NAME}/build
)
include_directories(${CMAKE_CURRENT_LIST_DIR}/../modules/${PACKAGE_NAME}/include)
但是有时会发生某些模块需要另一个模块,以便add_subdirectory
创建新的范围并且可以正确加载LIB
但无法编写它(当我使用set
它时,它处于更深的范围而不更改更高的范围)。为了绕过这个,我必须在)中添加PARENT_SCOPEset
。所以我尝试将它添加到一些我认为可以嵌套并隐藏在某些依赖项中的模块中,但编译我突然遇到的所有应用程序:
CMake Warning (dev) at /path_to_repo/cmake/FindFooX.cmake:6 (set):
Cannot set "LIB": current scope has no parent.
Call Stack (most recent call first):
CMakeLists.txt:14 (find_package)
This warning is for project developers. Use -Wno-dev to suppress it.
我担心这可能会因我需要的模块或模块本身的依赖树而因应用程序而异,所以我正在寻找更清洁的解决方案。