将库链接到另一个应用程序时,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 找不到库的主要内容,如果未能解决你的问题,请参考以下文章