将库链接到另一个应用程序时,cmake 找不到库

Posted

技术标签:

【中文标题】将库链接到另一个应用程序时,cmake 找不到库【英文标题】:cmake cannot find library when linking library to another application 【发布时间】:2020-02-10 05:21:19 【问题描述】:

我正在尝试生成现有应用程序的共享库,以便我可以将其链接到 gtest 应用程序。 我的主要应用程序 cmake 文件如下所示:

project(audiodLib CXX C)
cmake_minimum_required(VERSION 2.8.7)

## Lets store all the source code in $SOURCES
file(GLOB SOURCES src/*.cpp src/controls/*.cpp src/controls/pulse/*.cpp src/modules/*.cpp src/product/*.cpp src/umi/*.cpp src/umi/modules/*.cpp src/umi/soundSettings/*.cpp src/utils/*.cpp utils/*.cpp pmtrace/*.c)

##Lets generate the library
##Please note, here instead of $SOURCES if i try to directly add source code, I always get
##an error saying that cmake could not find any *.cpp files
add_library(audiodLib SHARED $SOURCES)

##Lets link it with libraries
target_link_libraries(audiodLib     $GLIB2_LDFLAGS
                $LUNASERVICE_LDFLAGS
                $PBNJSON_C_LDFLAGS
                $LUNAPREFS_LDFLAGS
                $POWERD_LDFLAGS
                $PMLOGLIB_LDFLAGS
                $NYXLIB_LDFLAGS
                $LIBPBNJSON_LDFLAGS
                $PULSE_LDFLAGS
                $LTTNG_UST_LDFLAGS
                $URCU_BP_LDFLAGS
                $PULSE_SIMPLE_LDFLAGS
                $WEBOSI18N_LDFLAGS
                pthread
                rt
                dl
                -lsnapshot-boot
                )

##Lets make this library availabel for other modules
install(TARGETS audiodLib LIBRARY DESTINATION $WEBOS_INSTALL_LIBDIR)

编译后在/usr/lib目录下生成libaudiodLib.so。 现在,如果我尝试在我的 gtest 代码中访问 audiodLib,如下所示:

##$WEBOS_INSTALL_LIBDIR = /usr/lib/
include_directories($WEBOS_INSTALL_LIBDIR)
target_link_libraries($GTEST_EXECUTABLE
    $WEBOS_GTEST_LIBRARIES
    $GLIB2_LDFLAGS
    $LUNASERVICE_LDFLAGS
    $PBNJSON_C_LDFLAGS
    $LUNAPREFS_LDFLAGS
    $POWERD_LDFLAGS
    $PMLOGLIB_LDFLAGS
    $NYXLIB_LDFLAGS
    $LIBPBNJSON_LDFLAGS
    $PULSE_LDFLAGS
    $LTTNG_UST_LDFLAGS
    $URCU_BP_LDFLAGS
    $PULSE_SIMPLE_LDFLAGS
    $WEBOSI18N_LDFLAGS
    pthread
    rt
    dl
    -lsnapshot-boot
    -laudiodLib
    )

我收到以下错误:

cannot find -laudiodLib

文件夹结构如下:

audiod/
CMakeList
    |src
|tests
    CMakelist

如果有人能指出我做错了什么,那将有很大帮助。在这上面花了 2-3 天后,我有点卡住了,一无所知。

【问题讨论】:

audiodLib 和 gtest_audiod 是不同的 CMake 调用。另外,安装 audiodLib 后,我希望在 gtest/CMakelist 中使用它。 可以像运行ldconfig 一样简单地更新您的ld.so 缓存。 感谢您的时间和建议@Botje 不幸的是它似乎没有工作。 您可以使用make VERBOSE=1 重新运行并粘贴生成的链接器调用吗? 如果我提供完整的路径,那么我的应用程序能够找到库,并且应用程序按预期工作。但是我知道这种方法是错误的,所以我正在寻找通用的东西。 【参考方案1】:

非常感谢你给我的建议和指点,我终于能够解决这个问题。 关于找不到库的问题,我通过重新排列 TARGET_LINK_LIBRARIES 来解决它,如下所示:

target_link_libraries(audiod
                audiodLib
                $GLIB2_LDFLAGS
                $LUNASERVICE_LDFLAGS
                $PBNJSON_C_LDFLAGS
                $LUNAPREFS_LDFLAGS
                $POWERD_LDFLAGS
                $PMLOGLIB_LDFLAGS
                $NYXLIB_LDFLAGS
                $LIBPBNJSON_LDFLAGS
                $PULSE_LDFLAGS
                $LTTNG_UST_LDFLAGS
                $URCU_BP_LDFLAGS
                $PULSE_SIMPLE_LDFLAGS
                $WEBOSI18N_LDFLAGS
                pthread
                rt
                dl
                -lsnapshot-boot
                )

以及我是如何在 do_package_qa 期间解决 BAD RPATH 错误的,我已经在这里回答了: bitbake do_package_qa issue contains bad RPATH

【讨论】:

以上是关于将库链接到另一个应用程序时,cmake 找不到库的主要内容,如果未能解决你的问题,请参考以下文章

如何正确地将库与 cmake 链接?

将库链接到 cmake 项目中的所有目标

CMake项目结构:如何正确地将库合并在一起并将它们包含在多个可执行文件中

“找不到 -l <​​目录>”错误 - CMake

NDK 与 cmake 的链接库

cmake找不到静态库