CMAKE:如何告诉库在哪里可以找到依赖项

cmake: how to tell library where to find dependencies

本文关键字:依赖 在哪里 何告诉 CMAKE      更新时间:2023-10-16

我想以静态方式构建一个库,并将其(连同其所有依赖项(集成到我的项目中。目标平台(从长远来看(是Android。目前,我只想在Windows主机上测试我的linux(debian 64位(vm的整个过程。生成的项目结构应如下所示

project/
|
|----- thirdparty/
|           |
|           |----- lib1/ (depends on 2 and 3)
|           |----- lib2/
|            ----- lib3/
 ----- application/

lib1 是我在应用程序中使用的库。所有库都已经为我当前的目标系统构建。我使用了库附带的configure脚本。因为 lib1 需要 lib2 和 lib3,所以我使用 with-lib2-prefix=<pathof-lib2> 引用了它们。我用来用QtCreator构建应用程序的cmake脚本链接lib1,如下所示:

ADD_LIBRARY(lib1 STATIC IMPORTED)
SET(lib1_path ${CMAKE_SOURCE_DIR}/thirdparty/lib1/lib1.a)
# and give path to external library with IMPORTED_LOCATION
SET_TARGET_PROPERTIES(gpgme PROPERTIES IMPORTED_LOCATION ${lib1_path}) 
//later...
target_link_libraries(  ${COMPONENT_NAME}                           
                        lib1
)

Lib1 按预期找到,但您可能已经怀疑找不到依赖项。事实上,我从来没有告诉cmake如何做。但是,因为我对cmake很陌生,我不知道这是如何完成的。

要么我想告诉 lib1 在哪里可以找到带有 cmake 的 lib2 和 lib3。或者,如果不接触lib1的"构建过程"就无法做到这一点,也许我可以以某种方式设法以正确的方式从cmake调用./configure。有没有人遇到类似的问题,可以给我一个建议如何做到这一点?

我解决了这个问题。我必须将每个依赖项库添加到我的 cmake 文件中:

ADD_LIBRARY(lib3 STATIC IMPORTED)
SET(lib3_path ${CMAKE_SOURCE_DIR}/thirdparty/lib3/lib/lib3.a)
SET_TARGET_PROPERTIES(lib3 PROPERTIES IMPORTED_LOCATION ${lib3_path})
ADD_LIBRARY(lib2 STATIC IMPORTED)
SET(lib2_path ${CMAKE_SOURCE_DIR}/thirdparty/lib2/lib/lib2.a)
SET_TARGET_PROPERTIES(lib1 PROPERTIES IMPORTED_LOCATION ${lib2_path})
ADD_LIBRARY(lib1 STATIC IMPORTED)
SET(lib1_path ${CMAKE_SOURCE_DIR}/thirdparty/lib1/lib/lib1.a)
SET_TARGET_PROPERTIES(lib2 PROPERTIES IMPORTED_LOCATION ${lib1_path})

然后按正确的顺序链接它们:

target_link_libraries(  ${COMPONENT_NAME}                           
                        lib1
                        lib2
                        lib3
)

如果在链接 lib1 之前链接 link2 和 lib3,链接器将"优化 lib2 和 3

"。