[완료] 리눅스 C++프로그램 컴파일 관련 질문입니다.

jchaney의 이미지

제가 하려는 것은 간단한 테스트인데, 내용은 다음과 같습니다.

test_dir이라는 디렉토리 밑에 socket 디렉토리와 main 디렉토리가 있습니다.

socket디렉토리에는 socket.h, socket.cpp 파일이 있고

main디렉토리에는 main.cpp가 있습니다.

main.cpp에서는 socket.h파일과 socket.cpp파일에 정의된 클래스를 사용하고

이것을 컴파일 시켜야합니다

제가 부딪친 문제는 main.cpp를 컴파일하면 socket.h와 socket.cpp파일에 정의된
클래스 사용시 컴파일 에러가 나오고, socket.h파일 인클루드 에러가 나온다는 것입니다.

다른 사람들이 정의한 Makefile을 참고하여서 해봤는데 잘안되고, 검색을 해봐도

검색어가 잘못된건지 검색이 안되어서 글을 올려봅니다.

파일 내용

socket.h내용
class socket {
socket();
~socket();
print();
};

socket.cpp내용
#include

using namespace std;

socket::socket() {}
socket::socket() {}
socket::print() {
cout << "hello"<< endl;
}

main.cpp
#include
#include"socket.h"

int main()
{
socket s;
s.print();
}

deisys의 이미지

시도했던 Makefile을 같이 올려주시면 더 좋았을텐데요. ;-)
조악하지만 일단 저런 식으로 하면 되긴 됩니다... 만, 디렉토리를 저렇게 넣어버리는건 좀 아니지요.
모든 디렉토리를 따라가며 xxxx.o 를 만들어주는 식으로 일반화시킬 수 있을것 같습니다.
여러가지 오픈소스 프로그램들의 소스를 다운받아서 Makefile 을 까보면 많이 배울 수 있을것 같네요.

deisys@igloo:~/works/test/test_dir$ cat Makefile
CC = g++
 
all: main
 
main: main.o socket.o
        $(CC) main/main.o socket/socket.o -o ./main.out
 
main.o: main/main.cpp socket/socket.h
        $(CC) main/main.cpp -c -o main/main.o  -I./socket/
 
socket.o: socket/socket.h socket/socket.cpp
        $(CC) socket/socket.cpp -c -o socket/socket.o
deisys@igloo:~/works/test/test_dir$

아, 그리고 위에 있는 저 코드 그대로 넣으면 컴파일이 안됩니다. 대강 고쳐서 테스트해봤구요...

1. print() 함수가 리턴값이 없네요.
2. socket::socket(); <- 이게 두개인데 하나는 socket::~socket(); 일거라고 생각해봅니다.
3. class 선언 안에 있는 것들은 기본으로 모두 private이라서 접근못해요~ 라는 컴파일타임 에러가 날듯?

--
Deisys, in the middle of the world, being with you . . . . . .

jchaney의 이미지

jchaney

deysis님 답변 감사드립니다.

저 코드는 제가 컷& 페이스트로 올린내용이 아니고, 제가 저런식으로 테스트를 했었다고 그냥 간단하게 제가 타이핑을 한 내용이라서 안 돌아가는것이 맞는거 같습니다. 간단한거라서 그냥 올렸더니 코드가 틀렸네요 ㅎ

올려주신 내용은 아직 실행해 보지는 않았는데, 테스트해보고 궁금한 점이 있으면 다시 글 올릴게요

일단 답글 달아주신것만으로 감사합니다 ㅎ

jchaney

jchaney의 이미지

jchaney

도움이 많이되었습니다. 다시한번 감사드립니다 ㅎ

제가 잘못한 실수가 -I./socket/ 이부분인데, 정확히 어떤걸 의미하는지는 더 찾아봐야 할것 같네요

제가 했던 내용을 정확히 말씀드리자면
test_dir에 Makefile이 있고 이 파일은 하위 디렉토리의 Makefile을 구동시킵니다.

socket 디렉토리에 Makefile이 있고 이파일은 socket.h와 socket.cpp를 컴파일하여 lib을 생성합니다.

main 디렉토리에 Makefile이 있고 이 파일은 socket디렉토이에서 생성된 lib을 참조하여

main.cpp를 컴파일하고 최종적으로 main이라는 실행파일을 생성합니다.

이런 내용을 해보려고 했었던 것이었고, 다른부분은 문제가 없었는데

main 디렉토리의 Makefile에서 main.o의 컴파일 옵션이 잘못되어서

socket이라는 클래스를 모르겠다고 계속 에러를 먹었던 것이었습니다.

Deisys님이 올려주신 Makefile내용을 참고하여 컴파일 에러는 해결되었고,

다시한번 감사드립니다.

좋은하루들 보내세요 ㅎ

jchaney

jchaney의 이미지

jchaney

제가 참고한 Makefile을 다시 분석해보니까 놓친 부분이 -I옵션 관련부분이었네요

이제 조금 알것 같습니다. 그냥 문제 해결이 확실하게되어서 올려보네요 ㅎ

jchaney

댓글 달기

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