플래시 뷰어와 같이 리눅스, 윈도우즈, 맥을 모두 지원하는 프로그램들은 어떻게 구현되었을까요?

namhw의 이미지

보통 웹브라우저에서 많이 쓰이고 있는 플래시 뷰어나 Adobe PDF 뷰어등은 자체적으로 Adboe와 같은 밴더자체에서 리눅스용과 윈도우즈용을 다운받아 사용할 수 있도록 제공을 하고 있는데요. 구현에 사용된 라이브러리(QT? GTK?)가 무엇인지 궁굼합니다. 만약 제가 여러 OS를 고려한 GUI환경의 프로그램들을 작성한다면 QT, GTK같은 라이브러리를 사용한다던가... 아니면 Java와 같인 가상머신 기반의 언어를 사용하여 구현할 것이라고 예상하는데요.

일반적으로 많이 쓰이는 프로그램인 플래시 뷰어나 Adobe의 PDF 뷰어가 Java로 구현되었거나 QT, GTK로 구현되지는 않은것 같은데요. 부족한 구글 검색 실력으로는 제 의문점을 찾을 수가 없어서... 이렇게 글을 올려봅니다~

NoBrain의 이미지

이전 회사에선 Linux와 Windows소스를 한 벌에 같이 구현했습니다.
C로 구현 했는데
#ifdef WIN32 뭔 이런 식으로 Windows인지 아닌지 구분 해서 컴파일 시에 구별되게 빌드 되도록 만들었습니다.
예를 들어 덧셈함수는 Linux와 Windows가 다를 필요 없으므로

int
sum (int a, int b) {
return a + b;
}
이렇게 만들고 print방법만 다르게 할 수 있습니다. 문법이 정확한지는 모르겠지만 이런 식으로..

#ifdef WIN32
win_print("result : %d\n", sum( 1, 2));
#else
linux_print("result : %d\n", sum(1, 2));
#endif

lqez의 이미지

어셈만 아니면 대부분의 PL은 멀티 플랫폼 성향을 가집니다.
C만 해도 지금은 JAVA등에 비해 덜-멀티플랫폼 스럽게 느겨지겠지만, POSIX C로 작성된 소스들은 플랫폼 종속적인 API만 쓰지 않는다면 대체로 잘 빌드됩니다.
NoBrain님 댓글처럼 preprocessor로 해결하는 방법도 있지만, 좀 더 대형 프로젝트인 경우은 보통 레이어링을 합니다.

대표적으로 mysql server를 예로 들자면, 플랫폼 종속적인 함수 호출을 위해서 mysql_ prefix가 붙은 함수군을 사용하는 것을 보실 수 있습니다. C++로 한다면 클래스로 할 수 있겠지요.

namhw의 이미지

답변 감사드립니다. 그러면 위에서 언급했던 플래시 뷰어나 Adobe PDF 뷰어는 답변해주신데로 프리프로세서를 이용하여 플랫폼별로 소스를 구분하여 작성한 후 컴파일 하거나... 플랫폼별로 달라지는 코드들을 레이어링하여 구현되었을까요? 그리고 플랫폼별로 달라지는 코드는... 윈도우용이라면 Win32 API를 쓰는 부분이 될테고.. 윈도우즈는 X11 API를 사용하는 부분일까요?

촌놈.

촌놈.

madman93의 이미지

서로 다른 플랫폼 간의 다른 특성을 가지는 부분은 그 플랫폼에 맞는 api를 쓰면 되고
공통된 부분은 같이 쓰면 되는 것입니다.
일단 처음 부터 다양한 플랫폼을 구상을 하고 짜시면 나중에 하시기 편하기는 합니다.
---------------------------------------------
git init
git add .
git commit -am "project init"
---------------------------------------------

---------------------------------------------
git init
git add .
git commit -am "project init"
---------------------------------------------

댓글 달기

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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.