터미널에서 사용하는 cd(change directory)와 pwd(print working directory)에 해당하는 명령어를 C에서도 사용하려면

Unix 기반 컴파일러(ex. gcc)는 unistd.h라는 헤더 파일을 include하면 되고,

Microsoft 기반 컴파일러(ex. Visual C++)는 direct.h라는 헤더 파일을 include하면 된다.


#include <unistd.h> // for Unix

#include <direct.h> // for Windows


cd에 대응되는 C언어 함수는 chdir(unistd.h)와 _chdir(direct.h)이고,

pwd에 대응되는 C언어 함수는 getcwd(unistd.h)와 _getcwd(direct.h)이다.


편의상 unistd.h를 include한다는 전제로 설명한다.

Visual C++에서는 아래의 과정에서 unistd.h 대신 direct.hchdir 대신 _chdir, getcwd 대신 _getcwd를 쓰면 된다.








1. chdir


c 파일이 있는 경로에서 test_folder라는 폴더로 이동하는 걸 생각해보자.

터미널에서는 아래의 명령어로 가능하다.


$ cd test_folder


이에 대응되는 c 코드는 다음과 같다.


chdir("test_folder");








2. getcwd


위의 chdir가 실제로 이동했는지 확인하려면 이동 전 주소와 이동 후 주소를 print해서 비교해볼 수 있다.

현재 디렉토리 주소를 저장하기 위해 다음과 같은 cwd란 char 변수를 선언한다.


 char cwd[1024];


이동 전 디렉토리 주소를 변수 cwd에 지정한 뒤 출력한다.


getcwd(cwd, sizeof(cwd));

printf("%s\n",cwd);


위의 chdir을 이용해 test_folder로 이동한다.


chdir("test_folder");


이동 후 디렉토리 주소를 cwd에 지정한 뒤 출력한다.


getcwd(cwd, sizeof(cwd));

printf("%s\n",cwd);




위 과정을 담은 test.c 코드와 실행 결과는 다음과 같다.


// test.c
#include <stdio.h>
#include <unistd.h>

int main()
{
    char cwd[1024];
    getcwd(cwd, sizeof(cwd));
    printf("%s\n",cwd);
    chdir("test_folder");
    getcwd(cwd, sizeof(cwd));
    printf("%s\n",cwd);

    return 0;
}


위의 test.c 실행 결과


Visual C++에서 사용할 수 있는 test_win.c 코드와 실행 결과는 다음과 같다.


// test_win.c
#include <stdio.h>
#include <direct.h>

int main()
{
    char cwd[1024];
    _getcwd(cwd, sizeof(cwd));
    printf("%s\n",cwd);
    _chdir("test_folder");
    _getcwd(cwd, sizeof(cwd));
    printf("%s\n",cwd);

    return 0;
}


위의 test_win.c의 실행 결과








Reference)

https://stackoverflow.com/questions/16285623/pwd-to-get-path-to-the-current-file

http://www.manpagez.com/man/2/chdir/

http://www.manpagez.com/man/3/getcwd/

https://msdn.microsoft.com/en-us/library/bf7fwze1.aspx

https://msdn.microsoft.com/en-us/library/sf98bd4y.aspx




'Programming > C' 카테고리의 다른 글

Visual C++을 command line으로 사용하기  (0) 2017.09.11
Sorting Algorithms Animations  (0) 2016.12.25
Windows에서 gcc 설치하기  (2) 2016.12.25
Intel MKL 설정하기  (0) 2016.11.28
OS X에서 gcc로 Open MPI 설행하기  (0) 2016.11.15




Visual Studio를 주로 사용하지 않아 확신하진 못하지만, VS에서 c 파일을 실행하려면 항상 프로젝트를 사용해야만 가능했다.

프로젝트를 매번 생성(혹은 지정)하는 것이 귀찮기도 하고 VS IDE를 실행하지 않으면서

Visual C++(Visual C라는 건 없다)로 컴파일을 할 수 있는 방법을 찾다가

cmd에서 command line으로 Visual C++을 컴파일하는 방법을 찾았다.


아래의 기준으로 설명한다.

- Visual Studio 2015 Community







1. test.c 생성


우선, 테스트용 c 파일인 test.c를 생성한다.

코드는 다음과 같다.


// test.c
#include <stdio.h>

int main()
{
    #ifdef _MSC_VER
        printf("Microsoft Visual C++ Compiler\n");
    #else
        printf("Other Compiler\n");
    #endif

    return 0;
}


Visual C++로 컴파일해서 실행하면 Microsoft Visual C++ Compiler가 나올 거고,

다른 컴파일러로 컴파일해서 실행하면 Other Compiler가 나올 거다.








2. 환경 변수 설정


command line에서 Visual C++을 컴파일하기 위해 필요한 환경 변수가 들어가 있는 vsvars32.bat 혹은 vcvarsall.bat을 cmd에서 실행한다.

vsvars32.bat은 32비트를 위한 환경 변수이고, vsvarsall.bat은 뒤에 인수를 어떻게 붙이느냐에 따라 달라진다.

(ex. vsvars32.batvsvarsall.bat x86과 같다)

vsvarsall.bat에 관해서는 2번째 Reference를 참고하면 된다.


vsvars32.bat은 아래의 경로에 있다.


C:\Program Files (x86)\<Microsoft Visual Studio Version>\Common7\Tools


vcvarsall.bat은 아래의 경로에 있다.


C:\Program Files (x86)\<Microsoft Visual Studio Version>\VC


<Microsoft Visual Studio Version>은 Visual Studio 버전에 따른 폴더명이다.

현재 내 환경에서는 Microsoft Visual Studio 14.0이다.








3. 컴파일 및 실행


test.c가 있는 경로로 이동한 뒤 다음의 명령어를 cmd에 입력해 컴파일을 진행한다.


$ cl test.c


위의 환경 변수 설정을 하지 않으면 다음과 같은 에러가 발생한다.


환경 변수 설정을 하지 않고 실행한 결과


그 다음 생성된 test.exe를 실행한 뒤 제대로 실행이 되는지 확인한다.

정상적으로 실행이 됐다면 Microsoft Visual C++ Compiler라는 문구가 뜬다.


$ test.exe


환경 변수 설정을 한 뒤 실행한 결과


앞서 test.c 생성에서 설명했듯 다른 컴파일러(ex. gcc)를 사용하면 Other Compiler라는 문구가 뜬다.


gcc로 컴파일을 한 결과








Reference)

https://msdn.microsoft.com/ko-kr/library/bb384838.aspx

https://msdn.microsoft.com/ko-kr/library/f2ccy3wt.aspx




'Programming > C' 카테고리의 다른 글

C에서 cd, pwd 명령어 사용하기  (0) 2017.09.11
Sorting Algorithms Animations  (0) 2016.12.25
Windows에서 gcc 설치하기  (2) 2016.12.25
Intel MKL 설정하기  (0) 2016.11.28
OS X에서 gcc로 Open MPI 설행하기  (0) 2016.11.15




Sorting Algorithms Animations

https://www.toptal.com/developers/sorting-algorithms



학부 시절에 C를 배웠다면 한 번쯤은 정렬 알고리즘을 해봤을 거다.

(지금 내 입장에선 안 쓰는 알고리즘이지만...)

알고리즘이 어떻게 작동되는지 애니메이션으로 나타나있는 사이트.


ps. 사이트 내 알고리즘 애니메이션을 첨부하고 싶었지만 웹 프로그래밍을 몰라서...;




'Programming > C' 카테고리의 다른 글

C에서 cd, pwd 명령어 사용하기  (0) 2017.09.11
Visual C++을 command line으로 사용하기  (0) 2017.09.11
Windows에서 gcc 설치하기  (2) 2016.12.25
Intel MKL 설정하기  (0) 2016.11.28
OS X에서 gcc로 Open MPI 설행하기  (0) 2016.11.15




Windows에서 gcc를 사용하려면 MinGW(Minimalist GNU for Winodws)를 설치해야만 한다.

다만, MinGW는 32비트만 지원하는 바람에 메모리 제약을 받을 수밖에 없어서, MinGW w64라고 하는 32/64비트용 MinGW를 설치하고 이걸 사용할 거다.

(MinGW와 MinGW w64는 독립적인 프로젝트다)

MinGW w64는 Sourceforge에서 다운을 받을 수 있다.


다운을 받은 뒤 실행하고 Next를 누르면 아래와 같은 선택 창이 나온다.



Version은 gcc 버전을 의미한다. 6.2.0을 그대로 둔다.

Architecture는 i686, x86_64가 있는데 i686은 32비트를, x86_64는 64비트를 의미한다. x86_64로 변경한다.

Threads는 posix와 win32가 있는데 posix를 선택한다.

Exception은 64비트에선 seh, sjlj가 있는데 seh를 선택한다.

Build revision은 위의 Version에서 revision을 의미한다. 6.2.1로 설치하기 위해 1로 둔다.



이렇게 설정한 뒤 계속 Next를 눌러 설치를 마친다.




설치한 gcc를 환경 변수에 추가하기 위해 내 컴퓨터 > 속성 > 고급 시스템 설정 > 환경 변수 > 시스템 변수 > Path로 들어가 다음을 추가한다:


C:\Program Files\mingw-w64\x86_64-6.2.0-posix-seh-rt_v5-rev1\mingw64\bin


환경 변수까지 제대로 했다면, 자신이 사용하는 shell에서 gcc(cmd, PowerShell, Git Bash 등)를 사용할 수 있다.

아래의 명령어를 통해 확인해본다:


$ gcc -v




Reference)

http://klutzy.nanabi.org/blog/2015/03/05/mingw/

http://stackoverflow.com/questions/29947302/meaning-of-options-in-mingw-w64-installer




1. Windows Visual Studio에서 설정하기


아래의 기준으로 설명한다.

- Visual Studio 2015 Community


1-1. Parallel Studio XE 2017 


1) 프로젝트에서 debug > Properties로 들어간다.

2) Configuration, Platform을 자신에게 맞게 설정한다. 특별히 정한 게 없으면 둘 다 All로 한다.

3) Configuration Properties > Intel Performance Libraries에서 Use Intel MKL을 병렬로 사용할거면 Parallel, 단일로 사용할거면 Sequential로 설정한다. 


1-2. Intel Math Kernel Library 2017


1) 프로젝트에서 debug > Properties로 들어간다.

2) Configuration, Platform을 자신에게 맞게 설정한다.

3) Configuration Properties > VC++ Directories > Include Directories에서 아래를 추가한다.


C:\Program Files (x86)\IntelSWTools\compilers_and_libraries_2017\windows\mkl\include;


4) Configuration Properties > VC++ Directories > Library Directories에서 아래를 추가한다.


C:\Program Files (x86)\IntelSWTools\compilers_and_libraries_2017\windows\mkl\lib;


5) Linker > General > Additional Library Directories에서 Platform이

5-1) x86이면 아래를 추가한다.


C:\Program Files (x86)\IntelSWTools\compilers_and_libraries_2017\windows\mkl\lib\ia32;


5-2) x64이면 아래를 추가한다.


C:\Program Files (x86)\IntelSWTools\compilers_and_libraries_2017\windows\mkl\lib\intel64;


6) Linker > Input > Additional Dependencies에서 Platform이

6-1) x86이고

6-1-1) 단일로 사용할거면 아래를 추가한다.


mkl_intel_c.lib;mkl_sequential.lib;mkl_core.lib;


6-1-2) 병렬로 사용할거면 아래를 추가한다.


mkl_intel_c.lib;mkl_thread.lib;mkl_core.lib;


6-2) x64이고

6-2-1) 단일로 사용할거면 아래를 추가한다.


mkl_intel_lp64.lib;mkl_sequential.lib;mkl_core.lib;


6-2-2) 병렬로 사용할거면 아래를 추가한다.


mkl_intel_lp64.lib;mkl_intel_thread.lib;mkl_core.lib;









2. OS X에서 command line 설정하기


아래의 기준으로 설명한다.

- gcc 6.2.1

- Intel Math Kernel Library 2017

- hello.c를 result.out으로 컴파일


편의상 MKL 설치 경로를 MKLROOT로 정의해서 쓴다.

bash_profile에다가 아래를 추가한다.


export MKLROOT=/opt/intel/compilers_and_libraries_2017/mac/mkl


1) Sequential


$ gcc -fopenmp -m64 -I${MKLROOT}/include -L${MKLROOT}/lib -Wl,-rpath,${MKLROOT}/lib -lmkl_intel_lp64 -lmkl_intel_sequential -lmkl_core -lpthread hello.c -o result.out


2) Parallel


gcc -m64 -I${MKLROOT}/include -L${MKLROOT}/lib -Wl,-rpath,${MKLROOT}/lib -lmkl_intel_lp64 -lmkl_intel_thread -lmkl_core -lpthread hello.c -o result.out








Reference)

https://software.intel.com/en-us/articles/intel-math-kernel-library-intel-mkl-compiling-and-linking-with-microsoft-visual-cc

https://software.intel.com/en-us/articles/intel-mkl-link-line-advisor




gcc 6.2.1을 사용하고 있고, Homebrew로 Open MPI를 설치(brew install openmpi)했다는 가정 하에 진행한다.

OS X에서는 Open MPI가 clang이 기본 설정으로 되어 있다.

그걸 gcc로 수정하는 과정이다.


터미널에서 /usr/local 내에 mpicc-wrapper-data.txt라는 파일이 어디에 있는지 다음의 명령어로 찾아낸다.


$ find /usr/local -name mpicc-wrapper-data.txt


그 위치를 따라가 텍스트 파일을 연다.

그러고 나서 compiler= 라고 되어 있는 곳을 찾아 clang 대신 gcc-6 혹은 gcc(gcc-6을 gcc로 연동시켜 놓았다면)로 수정한다.


위와 같은 방법으로 mpic++-wrapper-data.txt라는 파일을 찾아 g++-6 혹은 g++로 수정한다.








Reference)

http://stackoverflow.com/questions/26812780/linking-homebrew-compiled-openmpi-or-mpich2-to-homebrews-gcc




gcc로 C언어를 컴파일하던 중에 다음과 같은 에러가 뜨며 실행되지 않은 적이 있었다.


'for' loop initial declarations are only allowed in c99 mode use option -std=c99


for loop initial declaration을 할 경우 발생하는 에러다.

ex. for (int i = 0; i < 10; i++)

c99에서만 지원하기 때문에 -std=c99라는 옵션을 추가해서 c99로 바꿔서 컴파일을 하라는 말인데,

이렇게 하는 것보단 for loop 안에 들어가는 변수의 declaration을 loop 밖에서, 전에 미리 해두는 게 차라리 낫다.








Reference)

http://www.dreamincode.net/forums/topic/232288-codeblocks-for-loop-initial-declarations-are-only-allowed-in-c99-mode/

'Programming > C' 카테고리의 다른 글

Intel MKL 설정하기  (0) 2016.11.28
OS X에서 gcc로 Open MPI 설행하기  (0) 2016.11.15
OS X에서 OpenMP 실행하기  (0) 2016.11.09
OS X에서 gnuplot 설치하기  (0) 2016.11.08
Linux에서 #include <math.h> 사용하기  (0) 2016.11.08

 


 

우선, Xcode에서 지원하는 gcc와 clang으로는 OpenMP를 사용할 수 없다.

gcc 버전이 4.2.1이라 OpenMP를 사용할 수 없고, apple의 clang도 여전히 OpenMP를 지원하지 않기 때문에 다른 방법으로 OpenMP를 실행해야만 한다.

검색해서 찾아보니 2가지 방법을 알게 되었는데, 1번째는 clang-omp를 설치해서 실행하는 방법이고, 2번째는 최신 버전의 gcc를 설치하여 실행하는 방법이다.

(최신의 LLVM을 설치하여 clang과 llvm-gcc를 이용하는 방법도 있으나, 해보지 않아서 확실하지 않기에 나중에 해본 뒤 서술하겠다)


2016. 11. 28. gcc-6를 gcc로 변경하는 방법 추가

 

 

 



 

 

1. clang-omp로 실행하기

 

 

homebrew를 이용하여 터미널에서 다음과 같이 설치한다:

다만 바로 설치하려고 하면 homebrew에서 찾지 못하므로, 다음과 같이 tap을 한다.

 

$ brew tap homebrew/boneyard

 

그 다음에 clang-omp를 설치한다.

 

$ brew install clang-omp

 

설치가 다 되었으면 untap을 한다.

 

$ brew untap homebrew/boneyard

 

테스트를 하기 위해 간단한 코드를 짠 뒤 OpenMP를 다음과 같이 실행해보고 결과가 잘 나오는지 확인해본다.

 

 

$ clang-omp -fopenmp hello.c -o hello_clang

$ ./hello_clang

 

결과는 다음과 같이 나와야 한다.

 

TBA

 

 

 



 

 

2. gcc로 OpenMP 실행하기

 

 

최신 버전(현재 6.2)의 gcc를 설치하기 위해 homebrew를 이용하여 재설치한다.

정확히 기억은 나지 않지만,

brew reinstall gcc로 해서 재설치를 하면 multilib이 포함된 gcc라 OpenMP가 작동하지 않을 수도 있다고 하며,

multilib이 없는 gcc(brew reinstall gcc --without -multilib)로 설치하라고 안내가 뜰 거다.

그래서 brew reinstall gcc로 하는 과정을 생략하고 어떻게 설치과정을 거쳤는지 설명하겠다.


우선, 아래와 같이 터미널에서 입력해본다.

 

$ brew reinstall gcc --without -multilib

 

아마 다음과 같은 에러가 뜨면서 권한을 요청할 것이다.

 

Error: Permission denied - /usr/local/share/man/man7/fsf-funding-6.7

 

chmod를 이용해 설치하는 동안에만 권한을 수정한다.

 

$ sudo chmod 777 /usr/local/share/man/man7

 

이후 재설치를 다시 해본다.

 

$ brew reinstall gcc --without -multilib

 

설치하는 데 시간이 좀 걸린다. 설치가 다 되면 다시 권한을 되돌려 놓는다.

 

$ sudo chmod 755 /usr/local/share/man/man7

 

우리가 사용할 gcc 6.2는 gcc-6으로 지정되어 있다.

기존의 gcc는 위의 Xcode에서 받은 4.2.1 버전으로 실행되므로, OpenMP를 실행할 때 gcc-6으로 시작해서 하면 된다.

위의 예시를 다음과 같이 실행해본다.

 

$ gcc-6 -fopenmp hello.c -o hello_gcc

$ ./hello_gcc

 

결과는 위에서 했던 것과 똑같이 나올 것이다.



gcc-6로 계속 사용하는 게 불편하니 gcc로 gcc-6을 불러오게끔 수정한다.

homebrew로 설치하면 gcc-6의 위치는 /usr/local/bin일 것이다.

다른 방법으로 설치했거나 다를 경우 which를 이용해서 확인해본다.


$ which gcc-6


해당 위치로 이동한다. 여기서는 /usr/local/bin로 전제하고 한다.


$ cd /usr/local/bin


gcc-6, g++-6의 심볼릭 링크를 gcc, g++로 생성한다.


$ ln -s gcc-6 gcc

$ ln -s g++-6 g++


PATH를 확인해본다. 내 경우엔 /usr/local/bin이 기존 apple의 gcc 위치(/usr/bin)보다 앞에 있어서 수정할 필요가 없었다.


$ echo $PATH


앞에 없을 경우 .bash_profile 파일을 열어 위의 주소를 추가한다.

vim을 잘 다루지 못해 난 atom으로 열어서 수정했다.


export PATH=/usr/local/bin:$PATH 


터미널을 재부팅한 뒤 위의 예시에서 gcc-6 대신 gcc로 실행해본다.


$ gcc -fopenmp hello.c -o hello_gcc

$ ./hello_gcc


굳이 예제를 이용하지 않고 -v나 which를 이용해서 체크해도 상관없다.

 

 

 



 

 

Reference)

http://stackoverflow.com/questions/35134681/installing-openmp-on-mac-os-x-10-11

https://clang-omp.github.io

http://stackoverflow.com/questions/28970935/osx-replace-gcc-version-4-2-1-with-4-9-installed-via-homebrew/28982564#28982564







C에서는 그래프를 표현할 수 있는 수단이 없는데, gnuplot을 이용하면 가능해진다.

솔직히 데이터만 저장해서 Matlab으로 그리는 게 훨씬 더 좋다고 느끼지만...; 

그래도 C에서 바로 그린다는 게 특이해서 설치해보기로 했다.


다만 아직 터미널 쓰는 게 능숙하지도 않고,

맥에 대해 이것저것 모르는 게 많다 보니 설치하는 데 있어 좀 많이 헤맸다.

그래서 OS X에서 gnuplot를 설치하기 위해 내가 어떤 과정을 겪었고, 어떻게 해결했는지에 대해 써보고자 한다.








1. Xquartz 설치

 

 

x11을 사용하기 위해 설치한다.

OS X에서는 더이상 x11을 지원하지 않는다.

 

https://www.xquartz.org/

 

 

 



 

 

2. gnuplot 설치

 

 

Homebrew로 gnuplot을 설치하기 위해 터미널에서 다음의 명령어를 입력한다.

 

$ brew install gnuplot --with-x11

 

정상적으로 설치가 되면 다행인데, 아마 다음과 같은 에러가 뜰 거다.

(다른 에러가 뜰 수도 있다)

 

Error:  You must `brew link libpng fontconfig libtiff` before gnuplot can be installed

 

에러 메세지를 읽어보면 설치하기 전에 brew link libpng fontconfig libtiff를 하라고 한다.

하라는 대로 해보자.

 

$ brew link libpng fontconfig libtiff

 

해보면 또 안된다. 아래와 같은 에러가 뜬다.

 

Could not symlink share/man/man3/libpng.3 & /usr/local/share/man/man3 is not writable.

 

/usr/local/share/man/man3에서 쓰기 권한이 부여되지 않아 생긴 일이다.

해당 폴더에서 직접 권한을 수정하거나 chmod를 통해 권한을 수정하자.

이런 권한 수정은 sudo를 필요로 하므로 앞에 sudo를 붙여 다음과 같이 입력하자.

 

$ sudo chmod 777 /usr/local/share/man/man3

 

디폴트는 755이니 설치 후 다시 원상복귀시키자. 위에서 실행되지 않았던 brew link를 다시 해본다.

 

$ brew link libpng fontconfig libtiff

 

그 다음 다시 처음 입력했던 brew install을 한다.

 

$ brew install gnuplot --with-x11

 

마지막으로, man3 폴더의 권한을 원상태로 돌려놓는다.

 

$ sudo chmod 755 /usr/local/share/man/man3

 

 

 

 



 

 

3. 설치 확인 및 예제

 

 

TBA

 

 

 

 



 

 

Reference)

http://www.noktec.be/archives/1553 

http://apple.stackexchange.com/questions/103814/cant-plot-with-gnuplot-on-my-mac







Linux에서 c언어를 gcc로 컴파일할 때 수학 관련 함수들(sin, cos, sqrt 등)이 에러가 뜨며 실패할 때가 있다.

정확한 이유는 모르겠지만... linux에서의 gcc는 다른 OS들과 달리 math library(#include <math.h>)를 인지하지 못하나 보다.

그래서 command line에 -lm을 추가해야 정상대로 작동한다.








Reference)

http://stackoverflow.com/questions/10447791/what-does-lm-option-do-in-g




+ Recent posts