8월, 2017의 게시물 표시

[C, macOS] 상대경로 공유라이브러리

공유라이브러리는 자주 쓰는 함수들을 바이너리 형태로 만들어 두고, 필요할 때 불러서 쓸 수 있도록 합니다. c에서 공유라이브러리를 상대경로로 컴파일하지 않으면, 프로그램을 옮길때마다 일일히 라이브러리경로를 설정해줘야 하는 불편함이 있습니다. 오늘은 상대경로의 공유라이브러리 만드는 법을 알아보도록 합니다. 예시코드는 다음과 같습니다. 1. foo.c #include <stdio.h> void foo( void ) {     puts( "Hello, I'm a shared library" ); } 2. foo.h #ifndef foo_h__ #define foo_h__ extern void foo( void ); #endif  // foo_h__ 3. main.c #include <stdio.h> #include "foo.h" int main( void ) {     puts( "This is a shared library test..." );     foo();     return 0 ; } foo 함수는 텍스트를 출력하는 함수이고, 메인함수는 foo 함수를 불러오는 테스트 코드입니다.  컴파일 환경은 gcc이고 macOS에서 컴파일하였습니다. 순서는 다음과 같습니다. 1. 오브젝트 파일 만들기 $ gcc -c foo.c 2. 공유라이브러리 컴파일하기 $ gcc -dynamiclib -install_name '@rpath/libfoo.dylib' foo.o -o libfoo.dylib 3. 메인함수 컴파일하기 $ gcc -L/Users/leejijin/Desktop -Wl,-rpath,'@executable_path' -o test main.c -lfoo -L 뒤에는 컴파일 할 라이브러리의 경로

[Julia] Fortran Dll 불러오기

포트란에서 자주 사용되는 기능들은 함수나 루틴에 저장되어서 자주 사용되곤 합니다. 여러가지 데이터 타입이 입력값으로 들어가는데 오늘은 여러가지 형태의 입력값을 다루겠습니다. 먼저 첫번째로 정수 타입을 살펴보면 다음과 같습니다. 1. 포트란 라이브러리 코드 : test.f90 SUBROUTINE ADDROUTINE(M,N,K) !DEC$ ATTRIBUTES DLLEXPORT :: ADDROUTINE K = M + N END SUBROUTINE SUBROUTINE MULTROUTINE(X,Y,Z) !DEC$ ATTRIBUTES DLLEXPORT :: MULTROUTINE REAL ( 8 ) :: X( 2 ), Y( 2 ), Z( 2 ) DO I= 1 , 2 Z(I) = X(I) * Y(I) END DO END SUBROUTINE SUBROUTINE PRINTROUTINE(STR,N) !DEC$ ATTRIBUTES DLLEXPORT :: PRINTROUTINE CHARACTER (LEN=N) :: STR PRINT *, STR END SUBROUTINE SUBROUTINE LOGICALROUTINE(LOGICVAR) !DEC$ ATTRIBUTES DLLEXPORT :: LOGICALROUTINE LOGICAL LOGICVAR( 3 ) PRINT *, LOGICVAR END SUBROUTINE 먼저 첫번째 루틴은 정수형태의 입력값이며, 세번째 루틴은 CHARACTER 와 정수타입의 입력값을 갖습니다. 마지막 루틴은 LOGICAL 형태의 벡터를 갖습니다. 컴파일은 다음과 같은 명령어로 수행합니다. > ifort /dll test.f90 2. Julia Usage julia> N = Array{Int64}(1,1); julia> N[1,1] = 10; julia> M = Array{Int64}(1,1); julia>

[C/C++] Function

다음은 C/C++ 에서의 함수와 함수를 부르는 예제입니다. 여기서 C와 C++의 차이점은 메인함수에서 C는 void 를 허용하는 반면 C++에서는 반드시 int 타입의 값을 반환해야 합니다. 1. c : test.c #include <stdio.h> void Hellofun(){     printf( "Hello World from Function\n" ); } void main() {     Hellofun(); } ------compile $ gcc test.c 2. c++ : test.cpp #include <iostream> void Hellofun(){     std::cout << "Hello World from Function!\n" ; } int main(){     Hellofun();     return 0 ; } ------compile $ g++ test.cpp %함수의 위치가 호출되는 부분보다 상단에 위치해야합니다.

[FORTRAN] Shared Library 생성하기

자주 쓰는 함수나 루틴들은 공유라이브러리로 만들어 놓은 다음 사용하면 여러가지로 편의성을 제공합니다. 공유라이브러리는 Mac OS : *.dylib, Windows : *.dll, Linux : *.so 의 확장자를 갖습니다. 다음 예제를 통하여 공유라이브러리 코드작성법과 컴파일 방법을 알아봅시다. 1. Main : test.f90 PROGRAM MAIN !DEC$ ATTRIBUTES DLLIMPORT::HELLODLLRUTINE1 !DEC$ ATTRIBUTES DLLIMPORT::HELLODLLRUTINE2 CALL HELLODLLRUTINE 1 () CALL HELLODLLRUTINE 2 () END PROGRAM 2. Shared Library 1 : testdll1.f90 SUBROUTINE HELLODLLRUTINE 1 () !DEC$ ATTRIBUTES DLLEXPORT::HELLODLLRUTINE1 PRINT *, "HELLO WORLD FROM FIRST SHARED LIBRARY" END SUBROUTINE 3. Shared Library 2 : testdll2.f90 SUBROUTINE HELLODLLRUTINE 2 () !DEC$ ATTRIBUTES DLLEXPORT::HELLODLLRUTINE2 PRINT *, "HELLO WORLD FROM SECOND SHARED LIBRARY" END SUBROUTINE 4. Compile -Mac OS $ gfortran -c testdll1.f90 testdll2.f90 $ gfortran -shared -o testdll.dylib testdll1.o testdll2.o $ gfortran test.f90 testdll.dylib -Linux $ gfortran -c testdll1.f90 testdll2.f90

[FORTRAN] FUNCTION & SUBROUTINE

FORTRAN 에는 FUNCTION 과 SUBROUTINE이 있습니다. 반환되는 값이 있으면 FUNCTION을 사용하며, 없다면 SUBROUTINE이 사용됩니다. 다음의 간단한 예제를 살펴보면 차이를 알 수 있습니다. PROGRAM MAIN INTEGER HELLOFUN CALL HELLOROUTINE() T = HELLOFUN() END PROGRAM SUBROUTINE HELLOROUTINE() PRINT *, "HELLO WORLD FROM SUBROUTINE" END SUBROUTINE INTEGER FUNCTION HELLOFUN() PRINT *, "HELLO WORLD FROM FUNCTION" HELLOFUN = 0 END FUNCTION ----- compile & output $ gfortran test.f90 $ /Users/leejijin/Desktop/a.out HELLO WORLD FROM SUBROUTINE HELLO WORLD FROM FUNCTION

Windows 에서 Fortran DLL 생성하기

공유라이브러리는 유연성있는 프로그래밍환경을 조성하는데 있어서 자주 이용되는 형태의 프로그램입니다. 리눅스에서는 "a.so" 맥에서는 "a.dylib" 로 불리고 윈도우에서는 "a.dll" 형태의 확장자를 갖습니다. 오늘은 포트란으로 DLL 을 생성하는 방법에 대해서 알아봅시다. 1. DLL 코드 작성 파일이름 : f90arr.f90 SUBROUTINE ARRAYTEST(arr) !DEC$ ATTRIBUTES DLLEXPORT :: ARRAYTEST REAL arr(3, 7) INTEGER i, j DO i = 1, 3 DO j = 1, 7 arr (i, j) = 11.0 * i + j END DO END DO END SUBROUTINE 2. DLL IMPORT 하는 프로그램 코드 작성 파일이름 :  mainapp.f90 PROGRAM TESTA !DEC$ ATTRIBUTES DLLIMPORT:: ARRAYTEST REAL rarray (3,7) CALL ARRAYTEST(rarray) END PROGRAM TESTA 3. DLL 컴파일하기 > ifort /dll f90arr.f90 이 명령어를 실행하면 다음과 같은 파일들이 생성됩니다. "f90arr.o"  "f90arr.lib"  "f90arr.dll"  "f90arr.exp" >ifort mainapp.f90 f90arr.lib "mainapp.exe" 실행파일이 생성됩니다. 출처 - https://software.intel.com/en-us/node/535304

Mac에서 Jupyter 설치하기

Jupyter 는 웹기반 IDE로서 운영체제가 어느것이라도 동일한 개발환경을 줍니다. 파이썬 기반으로 돌아가는 것이기 때문에, 먼저 파이썬 설치가 필요합니다. 맥에서는 python2 는 이미 설치되어 있고, python3 경우에는 선행설치가 필요합니다. 그리고 다음과 같이 가상환경 생성을 합니다. 1. 먼저 "pip" 설치가 필요하고, pip을 이용하여서 "virtualenv" 를 설치합니다. $ sudo easy_install pip $ sudo pip install --upgrade virtualenv 2. 원하는 경로에 가상환경을 생성합니다. (python3 설치가 필요함) $ virtualenv --system-site-packages targetDirectory # for Python 2.7 $ virtualenv --system-site-packages -p python3 targetDirectory # for Python 3.n 3. 생성된 가상환경을 활성시킵니다. $ source ~/tensorflow/bin/activate # If using bash, sh, ksh, or zsh $ source ~/tensorflow/bin/activate.csh # If using csh or tcsh 만약 " targetDirectory" 를 python3test 라고 하였다면 다음과 같이 나타날 것입니다. (python3test)$ 4. 활성화된 가상환경에서 다음과 같은 명령어로 텐서플로를 설치합니다. $ pip3 install --upgrade pip # for Python 3.n $ pip3 install jupyter # for Python 3.n $ pip install --upgrade pip # for Python 2.n $ pip install jupyter # for P

Mac 에 GNU 컴파일러 설치하기

Mac은 Unix 기반의 운영체제로서 커맨드라인 유틸리티로 다양한 컴파일러들을 이용하는 것이 용이합니다. 그중에서 GNU 컴파일러들은 c,c++, fortran 컴파일러들이 포함되어있는 컴파일러 팩키지 입니다. 오늘은 GNU 컴파일러 설치에 대해서 알아보도록 합니다. 1. 앱스토어에서 Xcode 를 설치합니다. 2. 터미널을 실행시켜서, Command Line Tool 을 설치합니다.      $ Xcode-select --install 3. High Performance Computing for Mac OS X 사이트로 가서 GNU 컴파일러를 다운받습니다.       http://hpc.sourceforge.net/index.php 4. GNU 컴파일러를 설치합니다.    $ cd Downloads    $ sudo tar -xvf gcc-5.3-bin.tar -C / 5. GNU 컴파일러가 잘 설치되었는지 확인합니다.   $ gcc -v   $ g++ -v   $ gfortran -v 출처 -  https://wiki.helsinki.fi/display/HUGG/GNU+compiler+install+on+Mac+OS+X 만약 직접 컴파일러들을 소스코드로부터 빌드하고 싶다면 다음과 같은 방법을 따르면 됩니다. In this tutorial, I will show you how to compile from source and install the current stable version of GCC with Graphite loop optimizations on your macOS computer. The instructions from this tutorial were tested with Xcode 8 and Sierra (macOS 10.12). Clang, the default compiler for macOS, supports only C, C++, Objective-C and Objective-C++.