无法通过单击程序来运行程序,而我可以从终端运行

问题描述 投票:0回答:2

我正在尝试学习如何在 C++ 程序中构建和使用动态库。一切都很好,当我从终端启动程序时(我使用的是 mac OS X El Capitan),程序运行良好。令人惊讶的是,当我尝试通过单击可执行文件来启动它时,情况并非如此。我收到

dyld: Library not loaded: liblibrary.so
Reason: image not found
错误。

我的所有文件都在同一个库中。我用命令构建它们:

g++ -c -fPIC A.cpp
g++ -c -fPIC B.cpp
g++ -shared -fPIC A.o B.o -o library.so
g++ main.cpp library.so -o Program

提前感谢您的帮助。

我尝试了以下解决方案:

  • LD_LIBRARY_PATH
    DYLD_LIBRARY_PATH
  • 中添加 PATH
  • 更改库扩展名:
    library.so
    library.dylib
  • 添加 rpath
    g++ main.cpp library.so -Wl,-rpath,. -o Program
    g++ main.cpp library.so -Wl,-rpath,$HOME/my_dir -o Program
c++ macos shared-libraries
2个回答
3
投票

您可能需要在编译时给出明确的 rpath (作为绝对路径,而不是相对路径)(例如使用

g++ -Wall -Wl,-rpath,$HOME/yourdir  main.cpp library.so -o Program
),或设置一些
DYLD_LIBRARY_PATH
,请参阅 this。您可能需要一个
.dylib
后缀,而不是
.so
后缀。

(我已经没有MacOSX了,所以我忘记了细节)


1
投票

终于,我找到了解决办法。实际上,macOS 上的动态库创建是不同的。我从一开始就尝试过的方法仅适用于 Linux。

所以Mac的解决方案是:

g++ -dynamiclib -install_name "absolute_path/library.dylib" A.o B.o -o library.dylib

地点:

  • -dynamiclib
    在 Mac 上相当于
    -shared
  • -install_name "absolute_path/library.dylib"
    为链接器创建一个别名
    library.dylib
    ,这是使用
    library.dylib
    所必需的。

之后,传统命令:

g++ main.cpp library.dylib -o Program
如果

main.cpp

library.dylib
 位于同一目录中,
创建可执行文件。

只要

library.dylib
保持在同一个位置,该程序就可以在系统中的任何地方使用。

按照@Ssswift的注释,可以使用以下命令实现相对路径链接:

g++ -dynamiclib -install_name "@executable_path/library.dylib" A.o B.o -o library.dylib

该库可以跟随可执行文件。

感谢您的帮助。

© www.soinside.com 2019 - 2024. All rights reserved.