在我可以从终端中可以单击程序,无法通过单击程序来运行程序
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
您可能需要在编译时间(例如使用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.cpp
和library.dylib
在同一目录中,则创建可执行文件。
然后,只要library.dylib
留在同一位置,该程序就可以在系统中的任何地方使用。
按照@sswift的评论,可以使用命令来实现相对路径链接:
g++ -dynamiclib -install_name "@executable_path/library.dylib" A.o B.o -o library.dylib
库可以遵循可执行文件。
感谢您的帮助。
相关文章:
- 如何将我的程序添加到文件和文件夹的macOS右键单击菜单?
- 如何在后台模拟鼠标单击到 DirectX 应用程序?
- 无论如何,是否可以确定MFC应用程序是通过PC重新启动或用户单击应用程序快捷方式开始的
- 应用程序最小化时单击显示桌面/最小化全部
- 如何单击wxwidgets处理程序中的按钮
- 如何检查鼠标单击位置是必需的应用程序
- 如何添加C++/WinRT按钮单击处理程序
- 是否可以报告用户在 Android 应用程序中单击了哪些按钮
- 在我可以从终端中可以单击程序,无法通过单击程序来运行程序
- QT通过单击Menubar C 移动整个窗口/应用程序
- 如何通过单击 HTML 表单按钮在本地运行程序
- 当在C#中的WPF应用程序中单击一个按钮时,如何调用C 代码
- QT/C++,OS X:退出应用程序时可选择隐藏(),以便应用程序继续运行,并在单击dock中的图标后再次显示
- 单击上下文菜单项时运行程序
- C++模拟鼠标左键单击最小化程序
- 使程序在单击MessageBox(C++)上的“否”后自动关闭
- 单击“关闭控制台窗口”结束 C++ 控制台程序是正确的方法
- 使用 ncurses 捕获控制台应用程序上的鼠标单击
- 检查在ON_COMMAND_RANGE处理程序函数上单击了哪个按钮
- visual studio 2010-C++Windows窗体应用程序单击按钮即可访问另一个窗体