无法 运行 通过在终端上点击程序来实现
Cannot run a program by clicking on it while I can from Terminal
我正在尝试学习如何在 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
中添加路径
- 更改库扩展名:
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
您可能需要给出明确的 rpath (as an absolute path, not a relative one) at compile time (e.g. with g++ -Wall -Wl,-rpath,$HOME/yourdir main.cpp library.so -o Program
), or setup some DYLD_LIBRARY_PATH
, see this。您可能需要 .dylib
后缀,而不是 .so
后缀。
(我已经没有MacOSX了,所以忘记了细节)
终于,我找到了解决办法。实际上,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
然后库可以跟随可执行文件。
感谢您的帮助。
我正在尝试学习如何在 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
中添加路径
- 更改库扩展名:
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
您可能需要给出明确的 rpath (as an absolute path, not a relative one) at compile time (e.g. with g++ -Wall -Wl,-rpath,$HOME/yourdir main.cpp library.so -o Program
), or setup some DYLD_LIBRARY_PATH
, see this。您可能需要 .dylib
后缀,而不是 .so
后缀。
(我已经没有MacOSX了,所以忘记了细节)
终于,我找到了解决办法。实际上,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
然后库可以跟随可执行文件。
感谢您的帮助。