如何在CMake中自动链接本地生成的库或导入的库
How to link local generated library or imported library automatically in CMake
下面是我们项目的简单版本:
project/
├── CMakeLists.txt
├── dependency
│ └── CMakeLists.txt
├── factory_test
│ ├── CMakeLists.txt
│ └── FactoryTest.cpp
├── install
│ ├── include
│ │ └── locator
│ └── lib
│ └── locator
└── locator
├── CMakeLists.txt
├── Locator.cpp
└── Locator.h
CMakeList 的内容.txt依赖项:
cmake_minimum_required(VERSION 3.12)
project(dependency)
function(import_lib lib_name lib_dir_name)
add_library(${lib_name} STATIC IMPORTED GLOBAL)
set_target_properties(${lib_name} PROPERTIES
INTERFACE_INCLUDE_DIRECTORIES ${CMAKE_SOURCE_DIR}/install/include
IMPORTED_LOCATION ${CMAKE_SOURCE_DIR}/install/lib/${lib_dir_name}
IMPORTED_IMPLIB ${CMAKE_SOURCE_DIR}/install/lib/${lib_dir_name})
endfunction()
import_lib(import_locator locator/liblocator.a)
CMakeLists的内容.txt factory_test:
cmake_minimum_required(VERSION 3.12)
project(factory_test)
add_library(factory_test FactoryTest.cpp)
target_link_library(factory_test PUBLIC import_locator)
CMake列表的内容.txt定位器:
cmake_minimum_required(VERSION 3.12)
project(locator)
add_libary(locator Locator.cpp)
install(FILES Locator.h ${CMAKE_SOURCE_DIR}/install/include/locator)
install(TARGET locator ${CMAKE_SOURCE_DIR}/install/lib/locator)
热门CMakeList的内容.txt:
cmake_minimum_required(VERSION 3.12)
project(test_project)
add_subdirectory(dependency)
add_subdirectory(locator)
add_subdirectory(factory_test)
依赖关系层次结构factory_test依赖于依赖关系。我们想在顶部目录构建项目。我们编写 CMake 的目的是我们希望所有子目录都依赖于安装目录,以便我们可以构建任何一个子目录,而无需它的依赖子目录。
我们对这个 CMake 提案的问题是,如果修改了定位器的接口,并且我们想在顶级目录中构建项目,它将失败。因为定位器库仍未导出到安装目录。我们目前的方法是首先构建定位器并将其导出以进行安装,然后构建所有其他目标。
所以我想知道如果定位器目录存在,CMa factory_test ke 是否可以动态链接到本地生成的定位器库,或者如果目录不存在,或者有更好的 CMake 建议,则 CMake 是否可以动态链接到导入的定位器库这个问题?
希望熟悉这方面的人能给我们一些建议。感谢您的提前。
您可以在factory_test/CMakeLists.txt
中放置一个if语句来检查locator
目录是否存在。这将确定是直接链接到locator
CMake 目标,还是链接到导入的定位器目标。
cmake_minimum_required(VERSION 3.12)
project(factory_test)
add_library(factory_test FactoryTest.cpp)
# Check if the 'locator' directory exists.
if(EXISTS ${CMAKE_SOURCE_DIR}/locator)
target_link_library(factory_test PUBLIC locator)
else()
target_link_library(factory_test PUBLIC import_locator)
endif()
您可能需要调整 if 语句中的检查,因为从您的描述中不清楚哪些目录/文件可以访问,哪些不可访问。另外,我想您可能希望在顶级CMake文件中进行类似的检查,因为默认情况下它将遍历到locator
目录。
相关文章:
- lambda参数转换为constexpr技巧,然后获取带链接的数组
- CMake-按正确顺序将项目与C运行时对象文件链接
- 从链接列表c++中删除一个项目
- 有根的二进制搜索树.保留与其父级的链接
- 读取文件的最后一行并输入到链接列表时出错
- 静态数据成员的问题-修复链接错误会导致编译器错误
- 如何链接 DLL 以供 LoadLibrary() 使用(在 Windows 上的 C++ 中)并从调用 exe 导入变
- 如何在CMake中自动链接本地生成的库或导入的库
- 链接器找不到导入的 DLL 的 LIB 文件
- 目标提升::<library>已经有导入的位置 + 链接错误
- 链接导入的库与CMAKE外部项目
- Emscripten 链接静态库错误:wasm 流式编译失败:导入'env.getTempRet0'
- CMAKE:导入时链接 OpenCV 失败
- 导入库<>动态链接库兼容性
- cmake:链接静态导入库失败
- dll从VC++导入到VB函数的转换从dll返回错误,因为缺少链接库
- 如果使用LoadLibrary显式链接dll,则列出从PE文件导入的函数
- Swig创建的Java包Jython导入链接失败
- 按名称链接导入(c++ /Visual Studio)
- 通过导入库链接的DLL可以在卸载宿主DLL之前卸载吗?