error LNK2019 발생


최악의 링크 에러....


이에 대한 내용은 정리를 너무나 잘해 놓으신 분이 계셔서 그 글로 대체한다.



http://sadiles.blog.me/10072075057


컴파일 에러는 너무나 사람을 지치게 한다. 기껏 코딩해 놨더니 왜 컴파일이 안돼...


이번에 나온 오류는 


error C2220: warning treated as error - no 'object' file generated    요놈이다.


MSDN 참고 링크 

https://msdn.microsoft.com/ko-kr/library/ksk5k0ta(v=vs.120).aspx


컴파일러 오류 C2220

Visual Studio 2013
경고가 오류로 처리되어 생성된 개체 파일이 없습니다.

/WX는 컴파일러가 모든 경고를 오류로 처리하도록 합니다. 오류가 발생했기 때문에, 개체나 실행 파일이 생성되지 않았습니다.

오류는 /WX 플래그가 설정될 때에만 나타나고 경고는 컴파일하는 동안에 발생 합니다. 이 오류를 해결 하려면, 프로젝트의 모든 경고를 제거 해야 합니다.

해결하려면, 다음 방법 중 하나를 사용합니다

  • 프로젝트에서 경고를 발생 시키는 문제를 해결 합니다.

  • 낮은 경고 수준에서 컴파일합니다 — 예를 들어 /W3 를 사용합니다 (/W4대신).

  • 경고 pragma를 사용하여 사용 안 함 또는 특정 경고를 표시 합니다.

  • 컴파일 하기 위해 /WX 사용하지 않습니다.

MSDN 왈 이렇다고 한다.


그니깐 warning을 error로 취급하고 있다는 것.



해결방안은 두 가지가 있다.


1. 뭔지도 모르지만 그냥 warning을 무시.


프로젝트 우클릭 후 Properties에 들어가자.

Project Settings - Configuration Properties - C/C++ - General - Treat Warnings as Errors 항목이

ALL로 되어 있다면 No로 바꾼다.


해결.



2. warning 이 왜 뜨는지 확인하고 이를 해결.


이 때 확인해야할 부분은 어떤 warning이 error로 취급받고 있냐는 것이다.

output이나 error list에서 warning부분을 살펴보면 발견할 수 있다.


본인의 에러는 아래와 같았다.


warning C4819: The file contains a character that cannot be represented in the current code page (949). Save the file in Unicode format to prevent data loss


인코딩에러....라는 뜻이다. 

해당 파일의 인코딩을 unicode - codepage 1200로 바꿔주면 문제해결.


visual studio에서 인코딩을 바꾸려면 FILE-Advanced save option 를 클릭하면 원하는 인코딩을 선택할 수 있다.


혹은 


#pragma warning ( disable : warning번호)  

를 헤더파일에 입력해 주면 된다. 본인의 경우 #pragma warning ( disable : 4819) 
















'개발 > C and C++' 카테고리의 다른 글

error LNK2019 발생  (0) 2016.06.16
C/C++ 에서 clock() 함수를 이용하여 수행시간 측정하기  (0) 2016.06.16

C/C++ 에서 clock() 함수를 이용하여 수행시간 측정하기에는 여러가지 방법이 있겠지만

본인이 가장 선호하고, 가장 간편한 방법을 소개한다.


자료구조 전공시간에 전공 도서에서 함수의 수행 시간 측정하는 코드를 처음 접하였다.

(아마도 호로비치 자료구조 책일듯?)


boolean operation을 수행하는 두 라이브러리의 속도를 비교하기 위해서 수행시간 측정을 하게 되었다. 



먼저 clock 함수에 대해 알아보자. 

아래는 C++ 레퍼런스 사이트에서 가져온 내용이다. (링크 참고 : http://www.cplusplus.com/reference/ctime/clock/ )


function

<ctime>

clock

clock_t clock (void);
Clock program
Returns the processor time consumed by the program.

The value returned is expressed in clock ticks, which are units of time of a constant but system-specific length (with a relation of CLOCKS_PER_SEC clock ticks per second).

The epoch used as reference by clock varies between systems, but it is related to the program execution (generally its launch). To calculate the actual processing time of a program, the value returned by clock shall be compared to a value returned by a previous call to the same function.

Parameters

none

Return Value

The number of clock ticks elapsed since an epoch related to the particular program execution.

On failure, the function returns a value of -1.

clock_t is a type defined in <ctime> as an alias of a fundamental arithmetic type.

Example

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
/* clock example: frequency of primes */
#include <stdio.h>      /* printf */
#include <time.h>       /* clock_t, clock, CLOCKS_PER_SEC */
#include <math.h>       /* sqrt */

int frequency_of_primes (int n) {
  int i,j;
  int freq=n-1;
  for (i=2; i<=n; ++i) for (j=sqrt(i);j>1;--j) if (i%j==0) {--freq; break;}
  return freq;
}

int main ()
{
  clock_t t;
  int f;
  t = clock();
  printf ("Calculating...\n");
  f = frequency_of_primes (99999);
  printf ("The number of primes lower than 100,000 is: %d\n",f);
  t = clock() - t;
  printf ("It took me %d clicks (%f seconds).\n",t,((float)t)/CLOCKS_PER_SEC);
  return 0;
}


Output:

Calculating...
The number of primes lower than 100,000 is: 9592
It took me 143 clicks (0.143000 seconds).




간략히 정리해보면, clock 함수는 time.h(c++에서는 ctime) 헤더 파일에 들어있다.


clock_t clock(void); 의 형태로 선언되어 있으며, 그 내부가 궁금한 분은 직접 찾아보기 바란다.

(참고로 Visual studio에서 F12키를 통해 내부 선언으로 찾아갈 수 있다.)


여기서 반환형인 clock_t는 


typedef long clock_t; 


와 같이 선언되어 있는데, 그냥 long이라고 생각하면 된다.


사용법은 위의 예제와 같다. 

측정시작한는 부분에 clock()을 변수에 저장한 뒤, 끝날 때 시간을 빼고 CLOCKS_PER_SEC으로 나눠주면 된다.

즉,

  t = clock();   // 측정 시작
  /* 측정할 함수,코드가 들어갈 자리 */

  t = clock() - t;
  printf ("It took me %d clicks (%f seconds).\n",t,((float)t)/CLOCKS_PER_SEC);


와 같이 사용하면 된다.






qt, vtk 모두 최신버전으로 개발을 진행하려 하였으나, 

이전에 개발했던 프로그램이 Qt4 버전과 VTK 5.10 을 사용하여서 문법 및 라이브러리 호환성 때문에 버전을 내리기로 결정하였다.

vtk5 버전에만 있는 QVTK.lib 라는 라이브러리(이후 버전에서는 다른 이름의 여러 라이브러리로 나뉨) 문제와 qt4와 5 버전의 함수명 변화 등 때문이다.


구입해준 visual studio 라이센스가 2013 버전이기 때문에 해당 버전을 사용해야만 한다.

그런데 아쉽게도 qt 공식 홈페이지에서 제공하는 qt 4.x 버전은 visual studio 2012 (msvc2012)까지만 지원한다.

따라서 직접 빌드를 해야하는데, 이 방법은 시간이 너무 오래걸려서 박사님께 pre-compiled 된 qt 4.8버전을 구하였다.


이 후 방법은 전에 올린 설정 방법과 유사하므로 생략한다.





전문 복사해옴

출처 : http://neodelicious.tistory.com/232



Autotools보다 cMake가 얼마나 좋을까?
CMake는 Linux 외에 다른 OS에서도 범용적으로 build 환경을 제공한다는 점에서 분명히 장점이 있을 것 같다.

그런데 아직 CMake를 많이 안 써봐서 모르겠지만,
Autotools 에서는 기본값으로 되어 있는 'build command 보이기' 나 '-g 옵션을 추가' 등이
CMake에는 기본값으로 되어 있지 않은 등 분명 사용함에 있어서 차이가 있어 보인다.

KDE의 CMake 선정을 비롯한 사례로 볼 때 아마도 아직 내가 모를 뿐,
CMake에서도 Autotools의 기능을 대부분 지원하지 않을까 싶다.

아무튼 개인적으로 CMake의 소위 build template을 만들면서 공부한 것을 정리해서 올린다. 

아래 링크에서 source code를 download 할 수 있으며, 이하 글은 이 source code를 설명한다.

http://www.neodelicious.com/repos/cmake_example.tar.bz2


Assumption
1. Linux 환경을 기준으로 설명하며, '$'는 Linux Shell Prompt 를 의미함
2. 각 module 별로 CMakeLists.txt 파일을 생성하지 않고, (top directory)/CMakeLists.txt 에 모두 기술함을 기본으로 함
  2.1 원하면 (top directory)/CMakeLists.txt 파일에서 하위 directory 별로 CMakeLists.txt 파일로 분리하고 상위 directory의 CMakeLists.txt 에서 add_subdirectory 명령어를 통해 재귀적으로 호출할 수 있음
3. Top directory가 아닌 build directory에 build metadata를 생성하는 것을 기본(희망)으로 함
  3.1 Top directory에서 'cmake .'를 실행하면 top directory에 build metadata를 생성함

Reference
1. http://www.cmake.org/cmake/help/documentation.html
  1.1 http://www.cmake.org/cmake/help/cmake_tutorial.html
  1.2 http://www.cmake.org/cmake/help/cmake-2-8-docs.html


Note

1. 한 번 cmake build 하면 CMakeCache.txt 파일에 cmake build 결과의 설정값이 저장되는데, 이를 삭제하지 않고 CMakeLists.txt 파일을 수정하고 cmake build 하면 반영되지 않으니 주의해야 함


Preparation

1. $ tar xvjf cmake_example.tar.bz2
2. $ cd make_example


Build

1. Method 0 - CMakeLists.txt의 default 옵션으로 cmake build 하고, make 까지 진행하는 shell script를 이용 할 때
  1.1 $ ./start_build.sh
2. Method 1 - CMakeLists.txt의 default 옵션으로 cmake build르 직접 할 때
  2.1 $ mkdir build ; cd build
  2.2 $ cmake ..
  2.3 $ make
3. Method 2 - interactive 방식(wizard mode)으로 CMakeLists.txt의 옵션을 변경하여 make build 할 때
  3.1 $ mkdir build ; cd build
  3.2 $ cmake -i ..
  3.3 make
4. Method 3 - Curses Interface 로 CMakeLists.txt의 옵션을 변경하여 cmake build 할 때
  4.1 $ mkdir build ; cd build
  4.2 $ ccmake ..
  4.3 $ make


Run

1. build directory에 실행파일 example과 shared library인 libshow.so 파일이 있음
2. build directory에서 아래를 실행함
  2.1 $ ./example


CMakeLists.txt 파일 설명

# project
1. cmake_minimum_required (VERSION 2.6)
  1.1 cmake의 최소 버전을 명시함, 없으면 경고 메시지가 출력됨
2. project (cmake_example)
  2.1 새 project의 이름을 명시함
# user selectable variables
1. option (ENABLE_SHARED "Select OFF to build libararies as static" ON)
   option (DEBUG "Select ON to define DEBUG" ON)
   option (DEBUG2 "Select ON to define DEBUG2" ON)
  1.1 사용자가 선택할 수 있는 옵션에 대해서 이름, 설명, 기본값 순으로 설정함
2. message ("ENABLE_SHARED - ${ENABLE_SHARED}")
   message ("DEBUG - ${DEBUG}")
   message ("DEBUG2 - ${DEBUG2}")
  2.1 사용자 편의를 위한 화면 출력용으로 사용자가 선택한 값을 화면에 출력함
# dependency check
1. include (FindPkgConfig)
2. pkg_check_modules (pkgs x11>= 1.2.2 xrender)
  2.1 pkg-config tool을 이용해서 system의 library 정보를 확인할 수 있음
  2.2 아래와 같이 REQUIRED 옵션을 추가하여 조건에 부합하지 않으면 cmake build를 중단할 수 있음
    2.2.1 pkg_check_module (pkgs REQUIRED x11>=1.2.2 xrender)
3. foreach (flag ${pkg_CFLAGS})
     set (EXTRA_LIBS ${EXTRA_LIBS} ${flag})
   endforeach (flag)
   foreach (flag ${pkg_LDFLAGS})
     set (EXTRA_LIBS ${EXTRA_LIBS} ${flag})
   endforeach (flag)
 3.1 위의 pkg-config를 통해 얻은 CFLAGS, LDFLAGS 정보를 cmake 변수에 저장함
#global CMake variables
1. if (ENABLE_SHARED)
     set (BUILD_SHARED_LIBS true)
   endif (ENABLE_SHARED)
  1.1 명시적으로 static 혹은 shared 등을 명시하지 않은 add_library 명령에 대해서 기본 값인 static이 아닌 shared로 library를 build 하도록 설정함
  1.2. 이때 if 를 통해 위의 option에서 설정항 사용자의 선택에 따라 static일 경우 적용하지 않도록 함
2. set (CMAKE_VERBOSE_MAKEFILE ture)
  2.1 make build 할 때 build command를 화면에 출력하도록 함
3. set (CMAKE_BUILDTYPE debug)
  3.1 build 옵션에 -g를 포함하도록 함
4. set (CMAKE_INSTALL_PREFIX /usr)
  4.1 make install 을 통해 설치할 directory의 기준 path를 기본값이 아닌 /usr로 설정함
# global build variables
1. include_directories ("${PROJECT_SOURCE_DIR}/include")
  1.1 make build -I 로 설정하여 header file 을 찾을 path를 추가함
  1.2 PROJECT 는 최근 project 명을 대신하며, PROJECT_SOURCE_DIR 대신 여기서는 cmake_example_SOURCE_DIR 을 사용해도 됨
  1.3 PROJECT_BINARY_DIR 변수도 있는데, 이는 cmake를 실행한 path로서 여기에서는 build directory path임
# variables to the configuration file
1. configure_file ("${PROJECT_SOURCE_DIR}/include/config.h.in" "${PROJECT_SOURCE_DIR}/include/config.h")
  1.1 Source code에서 참조할 값을 반영한 config.h 파일을 config.h.in 파일을 수정해서 생성함
# build library
1. add_library (show lib/show.c)
  1.1 libshow.so 파일을 build 함
# build source
1. add_executable (example src/main.c)
  1.1 실행 파일 example 파일을 build 함
2. target_link_libraries (example show ${EXTRA_LIBS})
  2.1 실행 파일에 link할 library를 명시함
  2.2 이때 위에서 pkg-config를 통해 찾은 system 상의 library 정보를 추가함
# install
1. install (TARGETS show DESTINATION lib)
   install (TARGETS example DESTINATION bin)
   install (FILES ${PROJECT_SOURCE_DIR}/include/show.h DESTINATION include)
  1.1 기본적으로 make install을 위한 install target이 Makefile에 기술되지 않음
  1.2 위의 CMAKE_INSTALL_PREFIX 변수를 기준으로 make install에서 복사할 실행 파일, library 파일, header 파일을 명시함

include/config.h.in 파일 설명
1. #define ENABLE_SHARED "@ENABLE_SHARED@"
  1.1 cmake 내 EANBLE_SHARED 변수를 설정하면 @ENABLE_SHARED@ 값을 ON으로 변경하고, 비설정시 OFF로 설정함
2. #cmakedefine DEBUG
  2.1 cmake 내 DEBUG 변수를 설정하면 #define DEBUG를 설정하고, 비설정시 #undef DEBUG를 설정함
3. #cmakedefine01 DEBUG2
  3.1 cmake 내 DEBUG2 변수를 설정하면 #define DEBUG2 1를 설정하고, 비설정싱 #define DEBUG2 0를 설정함

먼저 필요 준비물은 제목에 적혀져 있는 바와 같이 (버전은 본인 자유이나 설정이 약간 다를 수 있음)


1. CMAKE-gui 3.5.2

2. Qt 5.6 

3. Visual studio 2013

이다.


필자는 위에 해당하는 버전을 사용하였다. 


CMAKE는 크로스 플랫폼으로 쉽게 만들기 위해서 사용하였다.


각각의 파일은 해당 프로그램의 공식 페이지에 들어가서 받으면 된다. visual studio community 버전은 무료다.

원하는 환경(32, 64bit)의 프로그램을 다운받아 설치하면 된다.


귀찮으신 분들을 위해 

https://cmake.org/download/

https://www.qt.io/download-open-source/

https://www.visualstudio.com/ko-kr/downloads/download-visual-studio-vs.aspx


링크를 준비했다. 다운받아 설치만 하자.


이제 진짜 빌드를 해야할 VTK 소스를 받아야 한다.

http://www.vtk.org/download/

링크에 들어가면 받을 수 있고 필자는 그냥 가장 최신 버전 7.0.0 버전을 받았다. (걍 뭣모르고 좋은게 좋은거라 생각하며... 최신버전 설치....)


CMAKE와 qt는 그냥 인스톨 버전으로 설치를 하면 된다.


폴더 구조는 PATH를 보기 편하게 하려고 C:드라이브 아래에 각각 qt와 vtk 폴더를 만들어서 진행하였다.

qt는 32bit와 64bit 모두 설치할 예정이라 폴더명을 특별히 버전.32bit로 지정하였다. VTK 폴더는 다운받은 압축파일을 해제하여 C드라이브 아래에

vtk 폴더와 그 안에 src 폴더를 생성한 뒤 복사했다.


필자의 폴더 위치는 아래와 같다.

Qt :     C:\Qt\Qt5.6.0.32bit

VTK :   C:\vtk\src\VTK-7.0.0


CMAKE로 빌드를 해보자. 여러 다른 블로그들을 참고 하였지만 각자 다 버전이 달라서 애매한 부분이 있다.

일단 CMAKE-gui를 열어보자.

Where is the source code 칸에는 위에 있는 vtk 소스가 있는 폴더를 적어 준다.

Where to build the binaries 칸에는 빌드한 결과가 저장될 폴더를 지정해 준다. 필자는 C:\vtk\bin.qt5.32bit로 하였다.

이후 configure를 눌러 컴파일러를 선택하고 디폴트 설정으로 마무리한다. (필자는 Viusal studio 12 2013으로 하였다. 32비트로 할거라서)


처음에 누르면 아마 에러가 날것이다. 당연한 거다. 추가해야할 entry가 많이 있기 때문. Grouped 설정을 눌러 group 별로 보기 편하게 한다.

본인은 이미 CMAKE를 한 뒤라 순서가 약간 다를 수도 있지만 양해 바란다.


일단 VTK_GROUP_Qt 에 체크한다. 다시 configure 클릭

VTK_QT_VERSION 에 5 입력. (필자는 5.6 버전이므로 5입력. 4.x 쓰시는 분들은 4 입력). 다시 configure

QT_QMAKE_EXECUTABLE 에 qmake 바이너리 FILEPATH입력. 필자의 경우 : C:\Qt\Qt5.6.0.32bit\5.6\msvc2013\bin\qmake.exe) 다시 Configure 클릭

이제 새로운 Entry를 추가해야 한다. Add Entry를 눌러서 CMAKE_PREFIX_PATH의 PATH를 설정해 주자. 

(필자의 경우 C:\Qt\Qt5.6.0.32bit\5.6\msvc2013 ) 다시 configure 클릭하면 아마 더이상 경고창이 뜨지 않을 것이다.


  • VTK_Group_Qt=1 (Boolean Checked)
  • VTK_QT_VERSION=5
  • QT_QMAKE_EXECUTABLE=C:/Qt/Qt5.6.0.32bit/5.6/msvc2013/bin/qmake.exe
  • CMAKE_PREFIX_PATH=C:/Qt/Qt5.6.0.32bit/5.6/msvc2013



최종 CMAKE 설정은 아래와 같다. 빨간색은 이미 빌드후에 다시 열어서 그렇게 보이는 것이니 참고만 하길 바란다. 





자 이제 비주얼스튜디오 프로젝트가 생성된 폴더로 가보자. (각자가 CMAKE 설정할 때 지정했던 폴더)

VTK.sln을 눌러 비주얼 스튜디오 솔루션을 열어보자.

수많은 프로젝트들이 있는데 그 중 ALL_BUILD가 bold체로 보일 것이다.



이후 릴리즈 모드로 빌드 시켜주면 끝!!










참고 블로그 : http://benjaminhopfer.com/2014/08/24/qt-5-vtk-6-and-visual-studio-development-environment/

(32bit / 64bit 모두 빌드하는 방법 설명)








 .off 확장자를 가지는 파일은 3d OFF(Object File Format) 이다. 


.off 파일을 열 수 있는 여러 프로그램들이 있겠으나 여기서는 무료로 제공하는 툴인 MeshLab을 이용한다.


사이트 : http://meshlab.sourceforge.net/



MeshLab

MeshLab is an open source, portable, and extensible system for the processing and editing of unstructured 3D triangular meshes. 
The system is aimed to help the processing of the typical not-so-small unstructured models arising in 3D scanning, providing a set of tools for editing, cleaning, healing, inspecting, rendering and converting this kind of meshes. 

홈페이지에도 잘 나와있듯 오픈소스 프로그램이다.

메인 페지이 중앙에 있는 Download Latest ~~를 클릭해서 운영체제에 맞는 파일을 다운 받는다.


설치는 클릭하다보면 알아서 잘 되고~~ 실행하면 아래와 같이 실행된다. 구 형태의 골프공 모양이다.



MPIR Library는 The Multiple Precision Integers and Rationals Library 의 약자다.


MPIR을 사용하기 위해서는 먼저 yasm을 설정해줘야한다.


전에 올린 글에 설명이 되어 있으니 아래의 링크를 참고하여 visual studio에 yasm을 설치하자.

2016/05/12 - [CS/환경설정] - VISUAL STUDIO에 YASM 사용하기 (Using yasm with VISUAL STUDIO)



http://lecnote.tistory.com/entry/VISUAL-STUDIO%EC%97%90-YASM-%EC%82%AC%EC%9A%A9%ED%95%98%EA%B8%B0-Using-yasm-with-VISUAL-STUDIO


Now, get MPIR from below link.

이제 MPIR 라이브러리를 다운 받자.


http://mpir.org/index.html#release


현재(16년 5월 12일) 필자가 받는 버전은 2.7.2 버전이다.






다운 받은 압축 파일을 풀면 

여러 폴더가 보이는데 그 중 현재 자신이 쓰고있는 VISUAL STUDIO 버전에 맞는 build.vcXX 폴더에 들어간다.

필자의 경우는 2013버전(vc 12.0)을 쓰고있으므로 mpir-2.7.2\build.vc12 아래와 같은 경로의 폴더에 들어갔다.


이 폴더 안에 있는 mpir.sln 파일을 연다. ( 비주얼 스튜디오 솔루션 파일)

비주얼 스튜디오가 열리면서 mpir 솔루션 안에 다양한 속성의 프로젝트 들이 있는 것을 확인할 수 있다.

각 프로젝트들의 설명은 아래 document로 대신한다.



이 중 본인이 원하는 환경에 맞게 프로젝트를 Release 모드로 빌드하면된다. 

필자는 C++ 개발을 할 예정이므로 이 중에서 cxx 버전을 빌드 하였다. 

위의 document에도 나와 있듯이 build가 성공하게 되면 mpir-버전 폴더 아래에 dll 폴더나 lib 폴더에 해당하는 파일이 생성된다. 


이제 visual studio에서 생성한 라이브러리를 사용할 수 있게 세팅해 보자.

필자는 lib_mpir-gc 를 빌드하였다. 따라서 mpir-2.7.2\lib\Win32\Release 폴더에 생성된 파일 중 mpir.lib와 mpir.pdb 두 파일을 복사하여

(cxx로 했으면 mpirxx.lib, mpirxx.pdb 도 포함)

C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\lib에 폴더에 붙여넣기 한다. (각자 환경에 맡게)


그리고 나머지 *.h 헤더파일도 복사하여 C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\include 에 붙여넣기 한다.


이러면 일단 설정 끝!


그후 실제 프로젝트에 사용하기 위해서는 프로젝트 설정을 바꾸는 절차가 필요하다. 

아래 예제를 따라해보자.




win32 콘솔 어플리케이션 빈 프로젝트를 하나 생성하고 아래의 코드를 복붙한다.

#include <stdio.h>
#include <mpir.h>

int main (int argc, char *argv[])
{
 mpz_t aBigPO2;

 mpz_init(aBigPO2);

 mpz_set_ui(aBigPO2, 1073741824); //2^30
 mpz_mul(aBigPO2,aBigPO2,aBigPO2); //2^60
 mpz_mul(aBigPO2,aBigPO2,aBigPO2); //2^120
 mpz_mul(aBigPO2,aBigPO2,aBigPO2); //2^240
 mpz_mul(aBigPO2,aBigPO2,aBigPO2); //2^480
 mpz_mul(aBigPO2,aBigPO2,aBigPO2); //2^960
 mpz_mul(aBigPO2,aBigPO2,aBigPO2); //2^1920

 mpz_out_str(stdout,10,aBigPO2);
 printf ("\n");

 mpz_clear(aBigPO2);
}


이후 프로젝트에서 마우스 오른쪽 버튼을 눌러 properties에 들어간다.


Configuration Properties - Linker - Command Line 에 들어간다.

아래 Additional Options 입력란에 mpir.lib 를 입력한다. (cxx를 설치한 경우 mpirxx.lib 도 함께 입력)  



그리고 나서 build 시켜보면 미션 석세스


2^1920 을 출력하는 프로그램인데, 아래와 같은 결과가 나오면 잘 실행된 것이다.


949711451807891414054698636958849699906924706346851167428009563305851
662866960338751057874083211050161729488483879798993810787765480587192
741530384819193300769874625884321977783469748956377553448566093328992
717820774610081821193616932757859144579109671494034728110890670954570
186561270637912025593911079819522904974136715161890547150302121514577
299257466073410681074505560366912534455201581754427662731068044605805
987604257959314070588213630129796572870132647963130222671409082294912
848599974253399700073940596408585364978789157781640247045138282505908
97948604589281308443672576










참고링크1 : http://hyacinth.byus.net/moniwiki/wiki.php/MPIR%EB%A1%9C%20C%2B%2B%20%EA%B3%A0%EC%A0%95%EB%B0%80%20%EC%97%B0%EC%82%B0%EC%9D%84%20%ED%95%B4%20%EB%B3%B4%EC%9E%90

참고링크2 : http://www.exploringbinary.com/how-to-install-and-run-gmp-on-windows-using-mpir/


GET YASM HERE : http://yasm.tortall.net/Download.html


The YASM version vsyasm.exe is designed specifically for use with Visual Studio 2010(or higher). To tell Visual Studio where to find vsyasm.exe, the environment variable YASMPATH can be set to the absolute path of the directory in which vsyasm.exe is located (this path should include the final backslash). 


BUT, it is uncomfortable. So I recommend another solution below.

Alternatively you can find the directory (or directories) where the VC++ compiler binaries are located and put copies 

of the vsyasm.exe binary in these directories. In my case, location on 64-bit Windows is:


 C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\bin 


(I'm using visual studio 2013)



여러 오픈소스 라이브러리를 사용하려 하다 보면 YASM이 필요한 경우가 있다.

몇몇 라이브러리들이 어셈블러로 yasm을 사용하기 때문이라고 한다. ( 불확실, 어디서 주워들은 정보)


http://yasm.tortall.net/Download.html


위의 주소에 들어가면 yasm을 구할 수 있다.


우리는 VISUAL STUDIO로 작업을 할 예정이기 때문에 

두 파일 중 각자의 환경에 맞는 파일을 받으면 된다. (2010 이상 버전의 비주얼 스튜디오)

그리고 이 안에 있는 실행파일 vsyasm.exe 파일을 아래 컴파일러가 있는 폴더에 집어 넣는다.


필자의 PATH :  C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\bin  (2013 버전을 사용중이다)




To use the new custom tools facility in Visual Studio 2010, you need to place a copy of three files - yasm.props, yasm.targets and yasm.xml - into a location where they can be found by the Visual Studio build customisation processes.  There are several ways to do this:


  a. put these files in the MSBUILD customisation directory, 

  which is typically at:


    C:\Program Files (x86)\MSBuild\Microsoft.Cpp\v4.0\BuildCustomizations


  b. put them in a convenient location and set this path in the 'Build Customisations Search Path' in the Visual Studio 'Projects and Solutions|VC++ Project Settings' item in the 'Tools|Options' menu; 


  c. put them in a convenient location and set this path in the 'Build Customisation dialogue (discussed later).



이제 새로운 툴을 설치 했으니 비주얼 스튜디오에게 그걸 반영하라고 해야한다.


설명서에는 몇 가지 방법을 제시하고 있는데 그 중 필자가 선택한 한가지 방법만 소개한다.


MSBuild 폴더에 설정파일들 ( yasm.props, yasm.targets, yasm.xml) 을 집어 넣는것이다.


필자의 경우 MSBuild 폴더의 위치는 아래와 같다.

C:\Program Files (x86)\MSBuild\Microsoft.Cpp\v4.0\V120\BuildCustomizations


각자의 환경에 맡는 폴더로 잘 찾아가서 yasm.props, yasm.targets, yasm.xml 이 세 파일을 복사해 넣으면 된다.











Cork는 리눅스, 맥, 윈도우 다양한 플랫폼을 지원한다.


다만 리눅스와 맥은 GMP 라이브러리를 사용하여 설치하지만, 윈도우의 경우에는 MPIR이라는 라이브러리를 사용한다.


둘다 기능과 사용법은 똑같은데 GMP를 윈도우에서 사용하기 어려워서 MPIR을 사용한다.


Cork를 빌드하기 위해서는 MPIR 라이브러리가 필요하므로  아래의 글을 읽고 설정을 하고 다시 돌아오자.


2016/05/12 - [CS/환경설정] - Windows VISUAL STUDIO에서 MPIR 라이브러리 세팅하기 (How to build and use MPIR with VISUAL STUDIO)



이제 본격적으로 cork를 빌드해보자.


먼저 https://github.com/gilbo/cork


코드는 위 주소에서 받을 수 있다. 해당주소 들어가서 Download ZIP 클릭한 후 압축을 풀자.


안에 보면 win/wincork 폴더가 있다. 프로젝트를 열어서 컴파일을 해보자.


다른 분들을 어떨지 모르겠으나 필자는 매우 많은 컴파일 오류가 났다. 이유는 헤더파일의 경로 때문이다.


다른 버전에서는 모르겠으나 visual studio 2013과 2015 에서는 모두 같은 문제가 있었다.


계속 컴파일 해가면서 경로 수정을 해주면서 컴파일에 성공했으나, 이 방법은 시간을 소모한다. 몇 개 안되는줄 알고 일일이 수정했다.

예를 들어 #include "vec.h"에서 오류가 생긴다면,  상대위치를 파악하여 #include "..\math\vec.h" 로 수정하는 식이다.

대략 20개? 정도 수정한 것 같다.


굳이 모양(?)을 신경쓰지 않는다면 아래의 방법을 추천한다.

모양새가 이쁘진 않지만 src 폴더안에 있는 하위 폴더들 (accel, math 등)에 있는 파일들을 모두 src 폴더 안에 넣는것이다.

이러면 include할 때 경로 문제가 발생하지 않을 것이다. 


빌드를 하게 되면 디버그 폴더 안에 wincork.exe 라는 파일이 생성된다. 

비주얼 스튜디오에서 start without debugging 으로 시작하게 되면 옵션이 없어서 프로그램이 바로 종료되므로 cmd에서 열도록 한다.


wincork.exe가 있는 폴더에 가서 폴더 주소창에 cmd 라고 입력하면 바로 현재 폴더로 명령프롬프트에 들어가진다.



wincork.exe -help 라고 입력하면 아래와 같은 설명을 볼 수 있다.





cork에서 기본으로 제공하는 example 파일을 통해 union 연산을 활용해 보자.

example 폴더는 cork 폴더 바로 아래에 있다. 이 안에는 ballA.off 파일과 ballB.off 파일이 있는데 같은 크기의 공 파일이다. 






참고로 .off 확장자 파일을 열고 싶다면 아래의 글을 참고하자.


2016/05/12 - [CS/환경설정] - *.off, off 확장자 파일 열기(How to open .off extension file)



cork로 union 연산을 하려면 wincork.exe -union input_file1 input_file2 output_file 처럼 입력하면 된다.


아래는 필자가 입력한 명령어 이다.

wincork.exe -union ..\...\samples\ballA.off ..\..\..\samples\ballB.off out.off



연산을 수행하면 아래와 같이 union 연산이 잘 수행 된 것을 볼 수 있다.







+ Recent posts