cmake:如何告诉库在哪里可以找到依赖项
cmake: how to tell library where to find dependencies
我想以静态方式构建一个库并将它(将所有依赖项一起)集成到我的项目中。目标平台(长运行)是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 的新手,所以我不知道这是怎么做到的。
要么我想用cmake告诉lib1在哪里可以找到lib2和lib3。或者如果不触及 lib1 的 "build-process" 这是不可能的,也许我可以设法以正确的方式从 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})
然后 link 它们的顺序正确:
target_link_libraries( ${COMPONENT_NAME}
lib1
lib2
lib3
)
如果您 link link2 和 lib3 在 lib1 被 linked 之前 linker 将 "optimize lib2 and 3 away".
我想以静态方式构建一个库并将它(将所有依赖项一起)集成到我的项目中。目标平台(长运行)是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 的新手,所以我不知道这是怎么做到的。
要么我想用cmake告诉lib1在哪里可以找到lib2和lib3。或者如果不触及 lib1 的 "build-process" 这是不可能的,也许我可以设法以正确的方式从 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})
然后 link 它们的顺序正确:
target_link_libraries( ${COMPONENT_NAME}
lib1
lib2
lib3
)
如果您 link link2 和 lib3 在 lib1 被 linked 之前 linker 将 "optimize lib2 and 3 away".