我正在使用 CMake 构建 C++ 应用程序。该应用程序应该在 VxWorks 操作系统上运行。该应用程序需要一个在外部构建并导入到项目中的共享库。
我已将库链接到应用程序,如下所示:
set(MYLIB_PATH"${CMAKE_CURRENT_SOURCE_DIR}/../../my/lib/}")
add_library(MYLIB SHARED IMPORTED)
set_property(TARGET MYLIB PROPERTY IMPORTED_LOCATION ${MYLIB_PATH}/libmylib.so)
target_link_libraries(MyApplication PUBLIC MYLIB)
我能够成功构建应用程序。现在,我将二进制文件放置在 AARCH64 目标上。以下是我的目标目录结构:
work
├── bin
└── lib
我已将应用程序放在 bin 中,将库放在 lib 中。 当我尝试执行该应用程序时,出现错误:
--> cannot open "/home/k271k9/workspace/software/apps/../../my/lib/libmylib.so"
我确实导出了环境
LD_LIBRARY_PATH=$LD_LIBRARY_PATH:../lib
,我通过使用ldd
命令验证了这一点,而且我链接的其他库也从lib目录正确链接。
我做的事情有什么问题吗?
如何让应用程序在 lib 路径中找到该库。有人可以解释为什么可执行文件在我构建应用程序的本地路径中寻找库吗?
有两个问题:
/home/k271k9/workspace/software/apps/../../my/lib/libmylib.so
,并且SONAME
。考虑到这两个条件,链接器将库的绝对路径作为
NEEDED
条目硬编码到可执行文件中,并且您的可执行文件将在上述路径中查找该库(并且仅在上述路径中查找)。
第 1 步:验证上述语句 - 第一个语句通过查看实际的链接命令,第二个语句通过运行 readelf -d /home/k271k9/workspace/software/apps/../../my/lib/libmylib.so | grep SONAME
(不应产生任何输出)。
第 2 步:解决问题。如果您自己构建
libmylib.so
,添加
-Wl,-soname,libmylib.so
将为它添加 SONAME
标签,然后其他一切都会正常工作(TM)。此外,与 /path/to/libmylib.so
链接也是不明智的。用
-L/path/to -lmylib
链接几乎总是更好。这样做将也解决您的问题(无需添加
SONAME
)。