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

Cannot run a program by clicking on it while I can from Terminal

本文关键字:程序 单击 运行 我可以 终端      更新时间:2023-10-16

我正在尝试学习如何在C 程序中构建和使用动态库。一切都很好,当我从终端启动它时,我的程序运行良好(我在Mac OS X El Capitan上)。令人惊讶的是,当我尝试通过单击可执行文件来启动它时,情况并非如此。我得到dyld: Library not loaded: liblibrary.soReason: 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_PATHDYLD_LIBRARY_PATH中添加路径
  • 更改库扩展:library.solibrary.dylib
  • 添加rpath g++ main.cpp library.so -Wl,-rpath,. -o Programg++ main.cpp library.so -Wl,-rpath,$HOME/my_dir -o Program

您可能需要在编译时间(例如使用g++ -Wall -Wl,-rpath,$HOME/yourdir main.cpp library.so -o Program)或设置一些 DYLD_LIBRARY_PATH在编译时间(例如,作为绝对路径,而不是相对的路径)给出一个。您可能需要一个.dylib后缀,而不是.so

(我没有任何macoSX,所以我忘记了细节)

最后,我找到了解决方案。实际上,动态库的创建对于macOS而言是不同的。我尝试的是从开始时才为Linux工作。

所以Mac解决方案是:

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

其中:

  • -dynamiclib-shared的Mac等效物。
  • -install_name "absolute_path/library.dylib"为链接器创建library.dylib的别名,这是使用library.dylib所必需的。

之后,传统命令:

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

如果main.cpplibrary.dylib在同一目录中,则创建可执行文件。

然后,只要library.dylib留在同一位置,该程序就可以在系统中的任何地方使用。

按照@sswift的评论,可以使用命令来实现相对路径链接:

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

库可以遵循可执行文件。

感谢您的帮助。