cmake:如何告诉库在哪里找到依赖项

时间:2016-02-12 14:22:46

标签: c++ build cmake build-process

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

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

lib1是我在我的应用程序中使用的库。所有的lib都已经为我当前的目标系统构建。我使用了库附带的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在哪里可以找到lib2和lib3和cmake。或者,如果没有触及&#34;构建过程&#34; lib1,也许我可以以某种方式设法以正确的方式从cmake调用./configure。有没有人有类似的问题,可以给我一个如何使这项工作的建议?

1 个答案:

答案 0 :(得分:0)

我解决了这个问题。我必须将每个依赖库添加到我的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”。