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。有没有人有类似的问题,可以给我一个建议如何使这项工作?

+0

这是否帮助https://cmake.org/cmake/help/v3.0/command/link_directories.html: link_directories($ {} CMAKE_SOURCE_DIR /第三方/ LIB2) – 2016-02-12 16:17:42

+0

我试图ADD_LIBRARY之前加入这一行(第二次尝试)直接在target_link_libraries之前。可悲的是,它没有奏效。我遇到了同样的错误,说“undefine reference ” –

我解决了这个问题。我不得不每天依赖库添加到我的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离开“。