wine에서 cpp사용시 stdc++와 msvcrt와의 충돌에 관하여.

cho's의 이미지

안녕하십니까? 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내부문서 >

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.