Mac Dynamic Library Craziness(可能僅僅是Fortran)
Mac Dynamic Library Craziness (May be Fortran Only)
我有这个 fortran 90 文件(将代码添加到问题的底部),我已使用以下命令将其编译为 OS X Mavericks 上的动态库:gfortran -dynamiclib trianglepy.f90 -o libtriangle.dylib
.这会产生存储在我的桌面上的libtriangle.dylib。我可以使用这个库(代码附在底部)制作一个C++文件。我比使用g++ main.cpp -o main -std=c++11 -L ~/Desktop/ -ltriangle
编译代码。这样可以完美地编译代码。但是当我运行生成的可执行文件时,出现以下错误:
dyld: Library not loaded: libtriangle.dylib
Referenced from: /Users/zacharykraus/./main
Reason: image not found
Trace/BPT trap: 5
当我跑otool -L main
时,我得到
main:
libtriangle.dylib (compatibility version 0.0.0, current version 0.0.0)
/opt/local/lib/libgcc/libstdc++.6.dylib (compatibility version 7.0.0, current version 7.20.0)
/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1197.1.1)
/opt/local/lib/libgcc/libgcc_s.1.dylib (compatibility version 1.0.0, current version 1.0.0)
如果我尝试将正确的路径导出到LD_LIBRARY_PATH或DYLD_LIBRARY_PATH。我得到同样的错误。运行可执行主文件的唯一方法是将文件主移动到桌面。这将成功运行以生成:
the angles are 33.5496 61.5496 28
the sides are 2.2 3.5 1.86885
注意:我不认为三角形实际上存在,而是实际问题。有人可以向我解释如何让可执行文件从与libtriangle.dylib所在的目录不同的目录运行吗?另外,为什么我的可执行文件只有在我将可执行文件移动到libtriangle.dylib所在的同一目录时才运行?
生成libtriangle.dylib的Fortran 90代码是:
!post all functions here
!double precision function area(side,angle)
! double precision side(3),angle(3)
!end
double precision function sidelos(angle1,angle2,side2)
double precision angle1, angle2, side2
!law of sines to calculate the missing side
sidelos=side2*sin(angle1*3.141593d0/180d0)/sin(angle2*3.141593d0/180d0)
end
double precision function anglelos(side1, side2, angle2)
double precision side1, side2, angle2
!law of sines to calculate the missing angle
anglelos=asin(side1*sin(angle2*3.141593d0/180d0)/side2)*180d0/3.141593d0
end
double precision function sideloc(side1, side2, angle3)
double precision side1, side2, angle3
!law of cosines to calculate side 3
sideloc=sqrt(side1**2 + side2**2 - 2d0*side1*side2*cos(angle3*3.141593d0/180d0))
end
double precision function angleloc(side1, side2, side3)
implicit none
double precision side1, side2, side3
!law of cosines to calculate angle3
angleloc=acos((side1**2 + side2**2 - side3**2) / 2d0/side1/side2)*180d0/3.141593d0
end
!post all subroutines here
subroutine asa(angle1, side3, angle2, angle, side)
double precision angle(3), side(3), sidelos
double precision angle1, side1, angle2
integer i
!f2py intent(out) angle
!f2py intent(out) side
angle(1) = angle1
angle(2) = angle2
side(3) = side3
!calculate the third angle
angle(3)=180-angle(1)-angle(2)
do i=1,2
!calculate the missing sides using law of sines
side(i)=sidelos(angle(i),angle(3),side(3))
end do
end
subroutine sas(side1, angle3, side2, angle, side)
double precision angle(3), side(3), sideloc, anglelos
double precision side1, angle3, side2
integer i
!f2py intent(out) angle
!f2py intent(out) side
side(1) = side1
side(2) = side2
angle(3) = angle3
!calculate the missing side with law of cosines
side(3)=sideloc(side(1),side(2),angle(3))
do i=1,2
!calculate the missing angles with the law of sines
angle(i)=anglelos(side(i), side(3), angle(3))
end do
end
subroutine sss(side1, side2, side3, angle, side)
double precision angle(3), side(3), angleloc, anglelos
double precision side1, side2, side3
integer i
!f2py intent(out) angle
!f2py intent(out) side
side(1) = side1
side(2) = side2
side(3) = side3
!calculate the missing angle with law of cosines
angle(3)=angleloc(side(1),side(2),side(3))
do i=1,2
!calculate the missing angles with the law of sines
angle(i)=anglelos(side(i), side(3), angle(3))
end do
end
subroutine aas(angle1, angle2, side1, angle, side)
double precision angle(3), side(3), sidelos
double precision angle1, angle2, side1
integer i
!f2py intent(out) angle
!f2py intent(out) side
angle(1) = angle1
angle(2) = angle2
side(1) = side1
!calculate the third angle
angle(3)=180-angle(1)-angle(2)
do i=2,3
!calculate the missing sides using law of sines
side(i)=sidelos(angle(i),angle(1),side(1))
end do
end
链接到动态库的C++代码是:
extern "C" void sas_(double*, double*, double*, double*, double*);
#include <iostream>
using namespace std;
int main()
{
double side1 = 2.2, side2= 3.5, angle3 = 28;
double angle[3], side[3];
sas_(&side1, &angle3, &side2, angle, side);
cout << "the angles are ";
for (double value : angle)
cout << value <<" ";
cout << endl;
cout<<"the sides are ";
for (double value : side)
cout << value << " ";
cout << endl;
return 0;
}
答案与动态库在 Mac OS x 中的工作方式有关。 os x 中的动态资源库始终在库中存储路径。编译动态库时,默认路径是库的名称。在编译时链接动态库时,库中的路径将存储在可执行文件中。因此,当您尝试运行 main 时,可执行文件会在当前目录中查找 libtriangle.dylib。这就是为什么如果你将libtriangle.dylib复制到当前目录,程序就会正常运行。
若要解决此问题,请将 -install_name 和绝对路径添加到编译中。然后重新编译链接到libtriangle.dylib的c ++文件。重新编译后重新运行otool -L main
给出:
main:
/Users/zacharykraus/Desktop/libtriangle.dylib (compatibility version 0.0.0, current version 0.0.0)
/opt/local/lib/libgcc/libstdc++.6.dylib (compatibility version 7.0.0, current version 7.20.0)
/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1197.1.1)
/opt/local/lib/libgcc/libgcc_s.1.dylib (compatibility version 1.0.0, current version 1.0.0)
现在可执行文件可以正常运行,而无需将动态库复制到当前路径。
- 在成员dynamic_bitset上使用 boost::from_block_range 时出错,但在本地dynamic
- 使用 VS2015 在 Windows 10 上构建 Fortran .lib x64 位并将其链接到 C++
- 将 OR 逻辑运算符从 C++ 转换为 Fortran
- C++类中的二维"dynamic"数组?
- Fortran 和 C++ 的混合编程:Fortran 不能调用C++子程序
- 如何在C++中获取真实值精度 与Fortran相同(Pararel Studio XE编译器)
- 读取 C++ 中的 Fortran 数据类型
- 重新编译我们的FORTRAN代码并在C++中使用后,我们的system()或C_str()命令无法正常工作
- 使用C++和fortran构建R包,Mac
- 如何将C++17 stdc++fs库链接到混合语言(C++和Fortran)CMake项目
- 混合编程 - 包括C++标头到 Fortran
- protobuf in C++ with dynamic binding for google::protobuf::M
- 编译 Fortran 和C++程序并从英特尔编译器链接
- 与 MSVC 一起使用的 MinGW 的 Fortran 模块导致未解析的符号"__exmod_MOD_value"
- 警告的原因是什么:"when type is in parentheses, array cannot have dynamic size"?
- 将指向 1D Fortran 数组的指针传递给使用 C_LOC() 进行C++会导致垃圾值
- 将分配给C++数组传递给 Fortran 子例程
- 在 Fortran 中泛化特定声明类型的操作
- CPP -D 选项,用于预处理 Fortran 代码
- Mac Dynamic Library Craziness(可能僅僅是Fortran)