c++ - cmake:如何告诉库在哪里可以找到依赖项

标签 c++ build cmake build-process

我想以静态方式构建一个库并将它(将所有依赖项一起)集成到我的项目中。目标平台(从长远来看)是 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 的“构建过程”这是不可能的,也许我可以设法调用 ./configure从 cmake 以正确的方式。有没有人有类似的问题,可以给我一个如何使这项工作的建议?

最佳答案

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

关于c++ - cmake:如何告诉库在哪里可以找到依赖项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35364918/

相关文章:

c++ - 从共享路径 URL 获取 IP 地址

c++ - 使用 gdb 调试共享库

build - 在 MSBuild 中生成后调用发布

python - cmake osx部署目标是 '10.11'但CMAKE_OSX_SYSROOT错误

c++ - CMake 错误 : Could not create named generator CodeLite - Unix Makefiles

c++ - 运行 .sh 脚本而不是可执行文件

c++ - clang 3.8 错误 : invalid linker name in argument '-fuse-ld=gold-2.25'

c# - 可以在构建脚本中将常量传递给 C# 编译器

c++ - 从构建中排除文件(自定义和临时)

c++ - 如何在linux可执行文件中使用静态库