C++ 사용시에... main이 없어도 되나요??

김대업의 이미지

컴파일 되고 실행도 되는데 main함수가 없는 소스를 찾았는데요...
이게 가능한건가요??
너무 신기해서...
c++사용 하시는 분들 답변 부탁드립니다.
혹시 제가 main을 못찾는건 아닌가 해서...

bugiii의 이미지

main 이 링크되는 라이브러리에 있는 프레임워크일 가능성도 있습니다.

익명사용자의 이미지

엔트리 포인트를 어떻게 세팅하느냐에 따라서도 달라질 수 있겠죠...

김대업의 이미지

자세하게 설명 해주시면 안될까요??
잘 이해가 안되네요..

Geniys의 이미지

main이 없으면 시작점을 찾지 못해서 실행이 불가능할 것입니다.
제 생각에 윗분들 말씀은 라이브러리나 다른 곳에 main함수가 있을껏 같다는 말씀 같습니다.
============================
A watched pot never boils.

============================
A watched pot never boils

ntwiz의 이미지

main이 있는 클래스에서 , 이 main없는 클래스의 역할을 객체로써 가져다가 쓴다고 해야할까요...
-_-a 알고 있음을 표현하기가 힘들군요;

pynoos의 이미지

find . -name "*.o" -exec nm -A {} \; | grep -w main

으로 나오는 object 파일을 생성해내는 소스에 있습니다.

ohhara의 이미지

설마 이런 경우인 지는 모르겠으나... (서얼마~)

Global Variable 형태로 class의 instance를 만들면 그 class의 constructor를 main함수 대용으로 사용할 수 있습니다.
하지만 link할 때 묘기를 좀 부려야 될 듯한 느낌이~

Taeho Oh ( ohhara@postech.edu , ohhara@plus.or.kr ) http://ohhara.sarang.net
Postech ( Pohang University of Science and Technology ) http://www.postech.edu
Digital Media Professionals Inc. http://www.dmprof.com

Taeho Oh ( ohhara@postech.edu ) http://ohhara.sarang.net
Postech ( Pohang University of Science and Technology ) http://www.postech.edu
Alticast Corp. http://www.alticast.com

ed.netdiver의 이미지

저도 이 경우가 아닌가 싶습니다.
예전에 봤던거라 가물한데, 객체 하나 달랑 있는, 생성자가 실제 main인 코드보고 덜덜덜했던 기억이 납니다.
(근데 그때 main에서 객체를 생성했었던건지, 전역변수로 하나 생성했었던건지가 확실치않네용^^;)

--------------------------------------------------------------------------------
\(´∇`)ノ \(´∇`)ノ \(´∇`)ノ \(´∇`)ノ
def ed():neTdiVeR in range(thEeArTh)

--------------------------------------------------------------------------------
\(´∇`)ノ \(´∇`)ノ \(´∇`)ノ \(´∇`)ノ
def ed():neTdiVeR in range(thEeArTh)

Scarecrow의 이미지

WinMain함수가 있지는 않은가요? ^^

wish의 이미지

사실 main 함수가 프로그램 시작할때 불리는 것은..

링커가 실행파일을 만들 때, main 함수를 call 하도록 파일을 생성해서 그렇게 됩니다.

컴파일 과정에서 일반적인 링커를 사용하지 않고, 수동으로 실행파일을 만들면 main 함수가 아닌 다른 함수를 콜할수도 있고, 아니면 아예 새로운 방식을 정의하는 것도 불가능 한 것은 아닙니다.

making smallest elf excutable 이던가 하는 문서를 구글링해서 보시면 금방 이해하실 수 있을 것입니다.

다만~

이 경우는 왠지 컴파일 중간에 프레임웍이나 라이브러리에 메인 함수가 포함되어 있을 확률이 높다는 생각이 듭니다.

익명 사용자의 이미지

그누 씨뿔뿔을 사용하는 경우에 링커 옵션을 이용하면 클래스의 컨스트럭터를 엔트리 포인트로 지정해서 동작하게 할 수 는 있습니다.
이리저리 시도해서 어찌어찌 되기는 했는데...
왜 이게 되는지 100% 이해는 못하겠네요

nomain.cpp
#import

class NoMain
{
public:
NoMain()
{
std::cout << "Hello World!" << std::endl;
exit(0);
}
} mainClass;

다음은 컴파일 명령입니다.
g++ nomain.cpp -Wl,-e,_mainClass -v

-Wl,-e,_mainClass 이거는 링커에게 -e _mainClass 옵션을 전달 하라는 명령 입니다.
이걸 이용해서 스태틱 변수를 엔트리 포인트로 지정을 해서 움직이게 하기는 했습니다만... 되는 이유는 정확히 모르겠네요.
아마도 mainClass의 주소와 NoMain 클래스의 컨스트럭터의 주소가 일치하기 때문에 동작하는게 아닌가 생각할 뿐 입니다.
실험을 해보지 않았지만 컨스트럭터 위에 다른 메소드가 들어가거나 하면 동작하지 않을 확률이 높다고 생각합니다.

댓글 달기

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