2014-11-27 2 views
0

다음 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을 사용하여 코드를 컴파일한다. 이것은 코드를 완벽하게 컴파일합니다. 내가 otool -L main를 실행하면 내가 시도하고 LD_LIBRARY_PATH 또는 DYLD_LIBRARY_PATH에 올바른 경로를 내보내는 경우 내가Mac 동적 라이브러리 Craziness (포트란 만 해당)

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) 

을 얻을

dyld: Library not loaded: libtriangle.dylib 
    Referenced from: /Users/zacharykraus/./main 
    Reason: image not found 
Trace/BPT trap: 5 

: 내가 생성 실행 파일을 실행할 때, 나는 다음과 같은 오류가 발생합니다. 같은 오류가 발생합니다. 실행 가능한 메인을 실행하는 유일한 방법은 파일 메인을 데스크탑으로 이동하는 것입니다. 이것은 성공적으로 생산을 실행합니다 :

the angles are 33.5496 61.5496 28 
the sides are 2.2 3.5 1.86885 

참고 : 나는 삼각형이 실제로 존재하지 않는다고 생각하지만 실제 질문을합니다. libtriangle.dylib가 아닌 다른 디렉토리에서 실행 파일을 실행하는 방법을 설명해주십시오. Additinally, 왜 libtriangle.dylib 같은 디렉토리에 실행 파일을 옮길 때만 실행 파일이 실행됩니까?

libtriangle.dylib을 생산하는 포트란 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; 
} 

답변

1

대답은 어떻게 동적 라이브러리 작업과 관련이있다 맥 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) 

이제 실행 파일은 현재 경로 동적 라이브러리를 복사 할 필요없이 제대로 실행됩니다.