cmake:如何告诉库哪里可以找到依赖关系
问题描述:
我想以静态方式构建一个库,并将其集成到一起(将它的所有依赖项)集成到我的项目中。目标平台(从长远来看)是android。目前我只想测试我的Linux(debian 64位)虚拟机在Windows主机上的整个过程。所得到的项目结构应该是这样的cmake:如何告诉库哪里可以找到依赖关系
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内所链接的链接之前链接链接2和LIB3将“优化lib2和3离开“。
这是否帮助https://cmake.org/cmake/help/v3.0/command/link_directories.html: link_directories($ {} CMAKE_SOURCE_DIR /第三方/ LIB2) – 2016-02-12 16:17:42
我试图ADD_LIBRARY之前加入这一行(第二次尝试)直接在target_link_libraries之前。可悲的是,它没有奏效。我遇到了同样的错误,说“undefine reference” –