wine에서 cpp사용시 stdc++와 msvcrt와의 충돌에 관하여.
안녕하십니까? Widow에서 작성한 어플리케이션을 linux에서 돌리려고 wine으로 작업하던중에 어려움이 있어서 이렇게 조언을 구합니다.
Wine으로 backup및 기타 어플을 거의 수정없이 linux로 옮긴상태인데 일부 모듈이 cpp로 되어있어 , 어려움이 있어 이렇게 조언을 구하네요.
현재 window로 작성된 프로그램을 wine상에서 돌리고 있습니다.
c로 작성된 소스들은 크게 이상이 없이 돌아가고 있습니다.
그런데 제가 궁금한 문제는 현재 cpp파일과 msvcrt와 충돌을 하는 점에 대한 것입니다.
Msvcrt의 dll을 import하고서 winemake를 한 이후에 컴파일을 하게되면
/usr/local/include/c++/3.3.2/i686-pc-linux-gnu/c++io.h /usr/local/include/c++/3.3.2/bits/fops.h /usr/local/include/c++/3.3.2/bits/char_traits.h /usr/local/include/c++/3.3.2/string:47 /usr/local/include/c++/3.3.2/cstdio:167 : error : ‘snprintf’ not declared. /usr/local/include/c++/3.3.2/cstdio:168 : error : ‘xxx’ not declared. …
과 같이 cstdlib쪽에서 계속 에러가 발생합니다.
Msvcrt를 winemaker에서 include하지 않는 경우에는 문제가 발생하지 않고요. –imsvcrt 를 winemaker에서 하는 경우 문제가 발생합니다.
cpp파일만 이런 문제가 있어서 cpp관련 gcc 소스를 분석해서 살펴보았는데 cpp include path에서 include하고 그다음에 msvcrt 가 끼어들어서 함수 prototype에 대한 정의를 찾지 못하는 건지 정확하게 이유를 찾지 못하겠네요.
cstdio쪽과 msvcrt의 header파일이 충돌을 일으킨다라고 생각이 들거든요.
다음은 cstdio파일의 주석입니다.
/** @file cstdio
* This is a Standard C++ Library file. You should @c #include this file
* in your programs, rather than any of the “*.h” implementation files.
*
* This is the C++ version of the Standard C Library header @c stdio.h,
* and its contents are (mostly) the same as that header, but are all contained in the namespace @c std.
*/
다음은 gcc에서 cpp파일을 컴파일 하기전의 구조체에 대한 예입니다.
제 생각은 cpp에서 header를 어떤 것이건 먼저 include하건 문제가 발생하지 않아야 정상일것 같거든요.
2.2.1 struct include file struct include file 구조체. 이 구조체는 $prefix/gcc/cppfiles.c 파일에 선언되어 있습니다. 원형은 아래와 같으며 이 구조체는 모든 include 들의 table을 갖고 있는데 사용됩니다. struct include_file { const char *name; const cpp_hashnode *cmacro; const struct search_path *foundhere; const unsigned char *buffer; struct stat st; int fd; int err_no; unsigned short include_count; unsigned short refcnt; unsigned char mapped; }; name 파일의 실제 경로 이름 cmacro Reinclusion 을 막는 어떤 macro. foundhere #include_next 와 sysp 를 위한 파일이 발견되 search path에서의 위치. buffer Cached 된 파일 content로의 포인터 st 파일을 위한 stat(2)data의 복사본 fd 파일을 열 때 사용한 fd (잠시 저장만 함) err no 만약 파일을 여는데 실패했다면 그에 대한 errno include count 파일이 읽힌 횟수 refcnt 이 파일을 사용하는 statcked buffer들의 개수 mapped file buffer가 mmapp 되었음을 나타냄.
<출처 kldp의 weongyo 님의 gcc내부문서 >
댓글 달기