[질문] c++에서 .a나 .so파일의 클래스 내부 함수를 사용할려면?

kddh1의 이미지

읽어주셔서 감사합니다.
리눅스 C++을 이용해 프로그래밍을 하고있습니다.
아주아주 간단한 콘솔 프로그램을-_-;;
그런데 문제가 생겼어요.
아래는 소스입니다.

test.cpp
--------------------------------------------------------
#include <iostream.h>
#include <linux/mini.h>

int main()
{

Reader = *pEar;
pEar = Rader::Connect(); <--- 이부분이 틀린듯.

if(!pEar)
{
cout << "Sorry" <<endl;
} else
cout << "Ok" << endl;
}
-------------------------------------------------------------
끝이네요.

컴파일은
#g++ -o test test.cpp -L/usr/lib -lsdk 로 했습니다.
저부분 빼버리고 컴파일하니깐 컴파일되서 ldd로 확인해보니
라이브러리링크는 제대로 걸린듯합니다. sdk가 libsdk.so입니다.

VC++에서는 클래스내의 맴버함수 부를때 저렇게 그냥 하니까 되던데 리눅스에서는 방법이 다른건가요?

libsdk.so를 nm으로 내용을 보면 분명히 있습니다.
그런데 컴파일하면
no method 'Reader::Connect' 라고 떠버리네요 T-T
방법아시는분 좀 알려주세요. 아 참

nm으로 보면
0012301 T _Z11Rader13ConnectEv 이렇게 나오네요
앞에 Z11이랑 가운데 13 뒤에 Ev는 필요없는거 아닌가요?

pynoos의 이미지

컴파일러 Major 버전이 다른걸로 빌드된 C++ 라이브러리는 상호 호환되지 않습니다.

참고로 nm에서 demangling을 하시려면 -C 옵션을 쓰시던가

nm libsdk.so | c++filt

명령으로 확인하면됩니다.

kddh1의 이미지

libILR_sdk-i386-gcc3-0.4.5.so 파일이 원 파일입니다.

Marjor 버전이라 하면-_-; 0.4.5를 말씀하시는듯한데
제가 쓰는 Gcc 버전은 3.2.2입니다. 뭐가 잘못된걸까요..
근데 저 위에서 저렇게 클래스내 맴버함수 부르는게 맞긴한건지요.
빠른 답변 정말 감사했습니다.

pynoos의 이미지

다시 생각해보니 빌드가 잘되었다고 하면 문제가 없을 것 같습니다.
오류메시지를 보여주시겠습니까?

kddh1의 이미지

pEar = Reader::Connect(); <-- 이 라인을 가리키며.
test.cpp : 7: cannot call member function 'virtual bool
Reader::Connect(int)' without object

라고 뜹니다 컴파일명령은 동일하고요. 메시지는 저게 다랍니다T-T
그러고보니-_- 메시지가 바뀌었네요 no method에서...
.so 또는 .a에서 불러와서 쓰는방법중 더 간단한 방법이 있을까요?

혹시 저 에러는 헤더파일하고도 연관되는건아닐지 궁금하네요.
그런데 .so같은 라이브러리에서 바로 함수를 불러오는건데도 헤더파일을 이용하나요? 아참 적어주신 nm -C 옵션으로 보니까
클래스부분이 이렇게 나오더군요 Reader::Connect(int) 라고..
그렇다는 이야기는 최소한라이브러리하고 연결은 되었다는걸까요..
sdk를 가지고 만드는거라-_-; 아참 관련 헤더파일을 뒤져봤는데

아마도? 저부분과 관련된부분같네요.
virtual bool Connect(int nPort = 1) =0; 이런부분이있네요
아마도 속내용은 .so 안에나 있을듯;;

익명 사용자의 이미지

pure virtual 함수이므로 반드시 상속해서 Connect 를 override해야하고, 상속된 놈으로 Connect를 해야합니다.

저 방법은 개체없이도 사용가능한 static 함수에서나 가능한 것이죠.

kddh1의 이미지

아 손님께서 말씀하신 단서를 열심히 찾아보렵니다^^
함수 상속에 오버라이드한다음에야 함수를 쓸수있다 이거군요.
찾아봐야겠습니다 감사합니다.

pynoos의 이미지

앗.. 손님이 저였습니다.

익명 사용자의 이미지

컴파일 했더니 아래와 같은 오류가 뜨는군요..
말씀하신대로 제대로 한건지는 잘모르겠지만 클래스 상속하고 오버라이딩도
된듯한데;; 오류가 나버리네요.. 어렵지만 열심히 해보렵니다..
시간되시면 좀 도와주시구요~

cannot declare variable 'var' to be of type 'Child'
because the following virtual functions are abstract:

'Connect' undeclared (first use this function)
(Each undeclared identifier is reported only once for each function it appears in.)

#include <iostream.h>
#include <linux/mini.h>

class Child : public Rader {
public:
virtual void Child::Connect(int nPort){
}
};

int main()
{
Child var;
(var *Connect)(1);
bool pEar=false;

if(pEar=false)
{
cout << "Sorry" <<endl;
} else
cout << "Ok" << endl;
}

hey의 이미지

부모 클래스에 순수 가상 함수가 있을 경우 자식 클래스로 인스턴스로 만들려면 모든 순수 가상 함수를 다시 구현해야 합니다. 헤더를 보시고

methodName() = 0;

형식으로 구현된 메쏘드를 모두 구현하셔야겠습니다.


----------------------------
May the F/OSS be with you..


byung82의 이미지

var.Connect( 1 );
일렇게 하시면 됩니다.

그럼

익명 사용자의 이미지

헤이님께서 알려주신 방법은 좀 시간걸릴듯해서 아직못해봤구요.
급한데로 간단한 병82님께서 알려주신 방법을 써봤더니

'Connect' undeclared (first use this function)
(Each undeclared identifier is reported only once for each function it appears in.)

이 오류가 사라졌네요. 그리고는 아래의 오류만 남았습니다.
열심히 캐봐야겠습니다^^ 저녁식사 맛있게 하세요~

cannot declare variable 'var' to be of type 'Child'
because the following virtual functions are abstract:

kddh1의 이미지

코드는 아래와 같습니다.

1 #include <iostream.h> 
2 #include <linux/mini.h> 

3 class Child : public Rader { 
4 public: 
5 Child()
6 {   }
7 virtual bool Child::Connect(int nPort=1)=0; 
8 }; 

9 int main() 
10 { 
11 Child *var; 
12 var = &Child::Connect();
13 var.Connect(1);

14 bool pEar=false; 

15 if(pEar=false) 
16 { 
17 cout << "Sorry" <<endl; 
18 } else 
19  cout << "Ok" << endl; 
20 }

아래는 오류입니다.

12번 라인에서 cannot call member function 'virtual bool Child::Connect(int)' without object

13번 라인에서는 request for member 'Connect' in 'var',which is of non-aggregate type 'Child*'

이런게 뜨네요. 왜 상속한 클래스에서까지 부를수없다고 하는건지T-T 12번이 에러나니 13번 에러는 당연한건지도 모르겠지만. 12번라인 에러는 정말 힘들군요.. 뭔가 다른게 있는건가요?;;

kddh1의 이미지

virtual bool Connect(int nPort = 1) =0; 이전버전에서는 이랬던것이
virtual bool Connect(int nPort = 1); 로 바뀌었습니다..
그런데 에러는 마찬가지로군요..

1 #include <iostream.h> 
2 #include <linux/mini.h> 

3 class Child : public Rader { 
4 public: 
5 Child() 
6 {   } 
7 virtual bool Child::Connect(int nPort=1); 
8 }; 

9 int main() 
10 { 
11 Child *var; 
12 var = &Child::Connect(); 
13 var.Connect(1); 

14 bool pEar=false; 

15 if(pEar=false) 
16 { 
17 cout << "Sorry" <<endl; 
18 } else 
19  cout << "Ok" << endl; 
20 }
순수가상함수도 아닌게-_-; 왜 못부른다고 하는건지 원..
12번 라인에서 cannot call member function 'virtual bool Child::Connect(int)' without object

13번 라인에서는 request for member 'Connect' in 'var',which is of non-aggregate type 'Child*'
아시는분들께 부탁좀 드리겠습니다. 해답이 정말 안보이네요..

doldori의 이미지

cannot call member function 'virtual bool Child::Connect(int)' without object

이 메시지는 클래스의 멤버 함수를 호출하려면 Child형의 개체가 있어야 한다는
뜻입니다. static이 아닌 멤버 함수를 단독으로 호출할 수는 없기 때문입니다.
따라서 11~13줄은 다음처럼 고쳐야 합니다. 물론 var는 적절하게 초기화되었다고
가정합니다.

Child *var; 
var->Connect(1); 
익명 사용자의 이미지

13번 line은

var->Connect(1);

이 맞겠지요.

그리고 12번 라인을 보면

var = &Child::Connect();

인데요, 정확하게 원하시는 결과가 무엇인가요? Child class의 Connect() 함수를 부르고 싶다라는 의미시라면 Connect()는 static 멤버여야 합니다. 그 외에는 아래처럼 Child class의 object가 있어야 하겠지요.

Child foo;
foo.Connect();

우선 Rader class에서 Connect() 함수가 어떻게 정의되어 있는지 알 수 있을까요? 아마 static 멤버가 아닐꺼라 추정됩니다.

kddh1의 이미지

13번 라인을 그렇게 ->로 고치고 나니 에러메시지가 바뀌었습니다.
세그멘테이션 오류라고^^; 그리고 손님! 제가 원하는건
공유라이브러리에 있는 클래스안에 있는 Connect()라는 함수를 끌어내서
사용하는것입니다. 말씀하신대로 static맴버함수는 아닙니다
virtual 맴버함수랍니다. 저도 Reader 클래스가 어케생겨먹은놈인지-_-
속을 보고싶습니다. 그런데 일단은 라이브러리안에 있는 클래스인지라..
nm -C로 들여다본결과로는 Reader::Connect(int) 이렇게 나오고
헤더파일이라고 있길래 들여다본것은
class SDK_API Reader
{
public:
| ~~~ 쭉나오다가.
virtual bool Connect(int nPort=1);
| ~~~ 또 쭉나옵니다.
}
이게 헤더파일에 있었습니다. 아무래도 함수 원형이지 않을까 하는데...
또 질문이 생기네요. 라이브러리를 이용하더라도 바로는 이용못하고
저런 헤더파일을 거쳐서 가는건가요? 열심히 세그멘테이션 오류를 잡아야겠습니다. 아 참 그리고 헤더파일에서 이런게 있네요
헤더안에 Reader 클래스 밑에요..
static Reader * ConnectCard(int nPort =1);
static Reader * ConnectCard(int nPort,int &nErrorCode);
이건 스테틱이라서 그냥 Reader::ConnectCard(1); 이렇게 불렀더니 메서드가 없다고 해버리네요-_- 이넘들 헤더파일에 적어놓은거랑 라이브러리 속이랑 다른건가...
하하 두분 감사드려요.

비행소년의 이미지

9 int main() 
10 { 
11 Child *var; 
12 var->Connect(1); 

설마 코드를 이렇게 쓰셨다는건 아니 시겠지요?.

아무리 봐도 object를 초기화 하는 부분이 없어서 드리는 말씀입니다.

높이 날다 떨어지면.
아푸다 ㅡ,.ㅡ

kddh1의 이미지

오브젝트 라면 var를 말씀하시는건가요..?
var를 따로 초기화시켜줘야하는건가요-_-;; 커헉~ 어렵군요-_- C++이란건. 맨땅에 헤딩이란건 아픈거군요 그래도 여기서 님처럼 답글달아주시는게 정말 도움이 많이됩니다T-T 감사.
참 gdb로 뭔 오류인가 보니까
Program received signal SIGSEGU Segmentation Fault
0x08049a3a in p.0 () 이런게 뜨는군요... 점심식사 맛있게드세요. 아 참고로 말씀드리면 아래는 VC++코드입니다 그건 DLL을 쓰는데-_- 라이브러리속까지 같은지는 모르겠습니다만..
MFC로 작성시 아래와 같이 했었습니다. 잘되더군요-_-;;

Reader *m_pReader;

CBasicDlg::CBasicDlg(CWnd* pParent /*=NULL*/)
	: CDialog(CBasicDlg::IDD, pParent)
{

m_pReader = Reader::ConnectCard();
if (!m_pReader)
{
MessageBox("Sorry, could not connect to reader. Insert Card and try again", NULL, MB_ICONSTOP);
EndDialog(0);
}
else
MessageBeep(MB_OK);
그래도 C++종류일텐데-_-
너무 상이하게 다르다니T-T 카드장비와의 통신이 되나 안되나
를 체크하는 부분인듯합니다.
익명 사용자의 이미지

라이브러리가 동일하다면 Reader::ConnectCard() 함수에서 돌려주는게 Reader * 인가 보군요. 동일하게

Reader *pReader = Reader::ConnectCard();

if(!Reader) 
{ 
cout << "Sorry" <<endl; 
} else 
cout << "Ok" << endl;

pReader->Connect();

하면 동작이 되나요?

덧) Reader *foo 와 Reader bar는 전혀 다른 코드입니다. bar는 Reader class의 object를 만들고 초기화 하지만, foo 는 단순히 pointer 변수입니다. 따라서

Reader *foo;

foo = new Reader;

이런식으로 해야 object가 생성되고 초기화 됩니다.

markboy의 이미지

계속 손님으로 남는군요. 위에 손님으로 남긴 2개는 제가 남겼습니다. :)

kddh1의 이미지

해봤는데 에러가 나고 먹히질 않네요T-T
마크보이님께서도 메모리관련쪽 침범이 아닌가 의심하시는건아닌지요?
이거참.. 어렵네요. 세그멘테이션 오류라는게 대부분이 메모리침범이라던데..

Child *var; 
요놈이 문제겠지요? 이놈이 var가 제대로 안되서-_-;;
var->Connect(1);에서 에러를 뿜는거겠지요...
이놈을 강제로 다른주소로 할당해줘야하는건가 T-T ..
kddh1의 이미지

저도 Child *var = new Child(); 를 생각하고 몇번 해봤지만..
컴파일할때 cannot allocate an object of type 'Child'
becase the following virtual function are abstract: 이런 메시지가 뜹니다 아무래도 가상함수가 있는 클래스를 인스턴스로는 만들지 못하나 봅니다
어렵네요.

lovewar의 이미지

kddh1 wrote:
저도 Child *var = new Child(); 를 생각하고 몇번 해봤지만..
컴파일할때 cannot allocate an object of type 'Child'
becase the following virtual function are abstract: 이런 메시지가 뜹니다 아무래도 가상함수가 있는 클래스를 인스턴스로는 만들지 못하나 봅니다
어렵네요.

virtual 이 있는 클래스는 생성하지 못합니다.
따라서 virtual 키워드를 삭제하고 정의하는 함수를 만드는 것으로 가능합니다.

어떤일을 할려고 하는지는 모르지만, 우선, C++ 책을 읽어보는것을
권해 드립니다.

3 class Child : public Rader {
4 public:
5 Child()
6 {   }
7 bool Child::Connect(int nPort=1) {
   // 생략
  }
8 };

9 int main()
10 {
11 Child *var = new Child();
      var->Connect(1);
// 생략

-- 덧붙이는 글 --
다음 책을 참고하시기 바랍니다.

More Effective C++
C++ Network programming Volumne 1

글을 지운 이유는 처음에 라이브러리를 그냥 사용하는 줄 알았습니다.

사용하고자 하는 클래스를 좀더 확인해 보시는 것이 좋겠습니다.

익명 사용자의 이미지

static Reader * ConnectCard(int nPort =1); 
static Reader * ConnectCard(int nPort,int &nErrorCode); 

위의 문장이 있는 걸로 봐서는 라이브러리에서 Object를 생성 시키고, 그 포인터를 리턴 시키는 것 처럼 보이는 군요.
그렇다면 아마도 Reader의 생성자를 Protected나 Private으로 해놓지 않았을까 하는 생각이 드네요.
라이브러리의 제작자의 의도는 카드 리더기를 사용하기 위한 Object이므로, 개발자가 카드 리더기의 숫자보다 많은 Object를 생성 시키지 못 하도록 막아 놓았다고 추측해볼 수 있을 것 같습니다.

kddh1 wrote:
저도 Child *var = new Child(); 를 생각하고 몇번 해봤지만..
컴파일할때 cannot allocate an object of type 'Child'
becase the following virtual function are abstract: 이런 메시지가 뜹니다 아무래도 가상함수가 있는 클래스를 인스턴스로는 만들지 못하나 봅니다
어렵네요.

만일 제 가정이 맞다면 Child *var = new Child();로 백날 해봐야 var는 초기화 되지 않을 겁니다.

윈도우 환경에서 실행이 되었다면 markboy님의 코드로 사용하는 것이 맞을 것 같은데요


Reader *pReader = Reader::ConnectCard(); 

if(!Reader) 
{ 
cout << "Sorry" <<endl; 
} else 
cout << "Ok" << endl; 

pReader->Connect();

이걸 빌드 시키고 에러가 났다면, 라이브러리가 정상적으로 올라왔는지 확인 하는 것이 필요 하지 않을까 싶습니다.

이왕 관련 서적 보시는 김에 Modern C++ Design 에서 Singleton부분도 한번 보시기 바랍니다.

익명 사용자의 이미지

이런 위엣글을 로긴안하고 썼군요 ...

비행소년의 이미지

이런 로긴이 이상하게 튕기네요

높이 날다 떨어지면.
아푸다 ㅡ,.ㅡ

kddh1의 이미지

기존에 갖구있던책이 평범한 책인데;; 대학교때 교재로쓰던..
시간되면 서점에 가서 꼭 책을 봐야겠네요. 답변주신분들 감사합니다.
다음에 또?? 부탁드립니다. 좋은하루 되세요. 아 근데 이책이-_-
ANSI C++인데 왜 예제를 그대로 따라해도 오류가날까요?
어이없음T-T

kddh1의 이미지

1 #include <iostream.h>
2 #include <linux/mini.h>

3 class Child : public Rader {
4 public:
5 Child()
6 { }
7 };
8
9 int main()
10 {
11 Child *var;
12 var->Connect(1);
13 if(!var->Connect(1))
14 {
15 cout<< "Sorry" << endl;
16 } else
17 cout << "Connect Ok" << endl;
18 }

이렇게 하고 컴파일을 했더니 오류가 안뜨네요-_-; 실행도 해봤지만
오류는 없었고요. 근데 저것도 제대로 되는건지도 모르겠지만;;
한가지 분명한건 var와 라이브러리의 Reader클래스가 연결이 된듯하다는것입니다. 카드장비를 활성화할려면 4-5단계인가를 거쳐서 클래스의
내부함수를 불러와줘서 셋팅을 하는건데.. 되는게 있고 컴파일 오류는 안나지만
세그멘테이션 오류가 나는부분도 있고-_-; 이거참 세그멘테이션오류라는건
정말 오묘하군요..

doldori의 이미지

kddh1 wrote:
이렇게 하고 컴파일을 했더니 오류가 안뜨네요-_-; 실행도 해봤지만
오류는 없었고요. 근데 저것도 제대로 되는건지도 모르겠지만;;

죄송한 얘기지만 이것이 전체 소스라면 제대로 안되는 것입니다. -_-;
var가 초기화되지 않았기 때문입니다. 그래서 seg fault도 나는 것이고요.
Child는 Reader를 상속받는데, 문제는 Reader가 추상 기초 클래스(ABC, abstract base
class)라는 것입니다. Reader 멤버 중에 virtual bool Connect(int nPort) =0 이
있다는 것은 상속받는 클래스에서 구현을 해줘야 한다는 뜻입니다. 그런데 Child에서도
구현이 없으니 Child도 ABC가 되고 당연히 Child 개체도 생성을 못하는 것이죠.
class Child : public Reader
{
public:
    // interface
    virtual bool Connect(int nPort);
};

// implementation
bool Child::Connect(int nPort)
{
    // do something
}

// now you can create Child objects
Child* var = new Child;
Child child;
var = &child;

이런 식으로 Child::Connect()의 구현을 제공하면 Child 개체를 생성할 수 있게 됩니다.

ps. iostream.h는 표준 헤더가 아닙니다. iostream과 std namespace를 쓰세요.

kddh1의 이미지

님께서 알려주신 코드로 해봤으나 오류가 뜨는군요..
추상기본클래스라서 Child* var = new Child; 를 못해주겠답니다. 혹시-_-;; 해서 여쭤보는건데...
상속클래스를 추상을 벗어나게 할려면
Reader에 있는 모든 함수를 상속클래스에 함수원형을 기록해주면
상속된 클래스는 더이상 추상적이지 않는건지... 궁금하네요.

위에 hey님께서. 적어주셨던..
------------------------------------------------------------------------------
부모 클래스에 순수 가상 함수가 있을 경우 자식 클래스로 인스턴스로 만들려면 모든 순수 가상 함수를 다시 구현해야 합니다. 헤더를 보시고

코드: methodName() = 0;

형식으로 구현된 메쏘드를 모두 구현하셔야겠습니다.
---------------------------------------------------------------------------------
이말씀이 그말이셨던건가요.. Reader클래스를 추상에서 벗어나게 할려면
Reader의 상속클래스에 모든 메서드를 저렇게 다 넣어줘야하는거였나요..
헉뜨-_-;;

hey의 이미지

kddh1 wrote:
이말씀이 그말이셨던건가요.. Reader클래스를 추상에서 벗어나게 할려면
Reader의 상속클래스에 모든 메서드를 저렇게 다 넣어줘야하는거였나요..
헉뜨-_-;;

맞습니다. :]
그리고 헤더에 선언만 하고 정의를 안 하신다면 링크 중에 에러가 또 날 수도 있습니다.


----------------------------
May the F/OSS be with you..


익명 사용자의 이미지

hey wrote:
kddh1 wrote:
이말씀이 그말이셨던건가요.. Reader클래스를 추상에서 벗어나게 할려면
Reader의 상속클래스에 모든 메서드를 저렇게 다 넣어줘야하는거였나요..
헉뜨-_-;;

맞습니다. :]
그리고 헤더에 선언만 하고 정의를 안 하신다면 링크 중에 에러가 또 날 수도 있습니다.

컴파일은 성공할지라도 실행에는 실패합니다.

현재 Reader 클래스를 상속한 X클래스가 library에 있다면, 이를 사용하시면 됩니다.

그렇지 않고 사용자 정의 클래스를 만들고자 한다면,
Reader 클래스가 지닌 성격들 중에서 추상화된 성격을 재정의해 주셔야 합니다. (순수 가상함수가 아닌 함수로)

kddh1의 이미지

만약 그런게 있다면 nm -C 정도로 모습이 드러나지 않았을지..
위에 헤이님 말씀처럼 선언은 하되 정의가 되지 않으면 오류가 날거라 하셨는데
그 말씀은 즉

 class Child:public Reader {
public:
   메쏘드1();
   메쏘드2();
   메쏘드3();
}; 
이렇게 메쏘드들을 선언을 하고나서 각 메소드에 대한 정의를 해야한다는.. 말씀이신가요.
 class Child::메쏘드1()
{
// 비었네요-_-
}
이렇게 되는건가요.. 하지만 메쏘드1의 소스코드를 모른다면-_-;;
main()에서 불러봐야 아무런 동작이 없겠네요 속이 비었으니... 비록 라이브러리에는 정의되어 있을지언정 말이지요.. 크악 이럴거면 라이브러리를 왜 만들어놓은거지.. 본래 코드를 모르는 상태라면 라이브러리를 이용하기는 힘든건가요..
비행소년의 이미지

kddh1 wrote:
main()에서 불러봐야 아무런 동작이 없겠네요 속이 비었으니... 비록 라이브러리에는 정의되어 있을지언정 말이지요.. 크악 이럴거면 라이브러리를 왜 만들어놓은거지.. 본래 코드를 모르는 상태라면 라이브러리를 이용하기는 힘든건가요..

상황을 보아 하니 디바이용 라이브러리 같은데, 최소한의 문서라도 있을거라 생각됩니다만, 저라면 라이브러리 제작자와 디바이스 판매자를 압박하겠습니다.

높이 날다 떨어지면.
아푸다 ㅡ,.ㅡ

kddh1의 이미지

문제는 카드 제조업체가-_- 외국회사입니다. 디바이스 판매자에게
계속 전화를 하고 있지만 자기들도 외국회사에 연락해보니 코드넘겨주는데
시간이 걸릴것같다고 답이 왔답니다-_-; 다 만들어진 코드 소비자에게
넘겨주는게 뭐가 그리 문제인지-_- 샘플코드좀 달라는게 그렇게 힘이든가T-T
리눅스가 인지도가 많이 딸리긴하나봅니다T-T 크흑 슬픈현실..
윈도우용은 문서가 있었습니다. SDK에 말이지요.
윈도우용으로 C++용으로 말입니다. 그것도 DLL을 이용한 MFC더군요.
MFC에서는 걍 ::으로 잡아버리는걸루 알고있는데-_-;;
닷넷용으로도 있었습니다 SDK가 말이지요.
리눅스용... 있긴있는데 문서가없습니다
SDK라고 주길래 설치는 했습니다만. 문서가 전혀없네요
그냥 /usr/lib에 라이브러리 파일 .so .a각각 한개씩 깔린게 전부고
/usr/include/linux에 헤더파일 16개정도? 깔린게 전부입니다.
헤더파일 들여다 보면 머라고 이상한것들을 잔뜩 주석처리해놨고-_-;
함수들의 선언들밖엔없고... 그것조차도 보아하니 윈도우용으로 만들었던
헤더파일을 좀 수정한듯합니다. Win32 이런단어도 보이고-_-;;
아 어렵게 돌아가네요T-T

익명 사용자의 이미지

kddh1 wrote:

그냥 /usr/lib에 라이브러리 파일 .so .a각각 한개씩 깔린게 전부고
/usr/include/linux에 헤더파일 16개정도? 깔린게 전부입니다.

헤더 파일에서 답을 찾아야 할것 같습니다.
Rader 클래스(Reader 클래스인지 혼동이 ..)가 선언된 부분이 있는지 확인한 후에 있으면
그 클래스를 상속받은것이 있는지도 확인해야 합니다.

그리고 나서, 상속 받은 것이 없다면, 사용자 정의 클래스를 만들어야 겠습니다.
문서는 windows 용을 참조해서 구현하는 것이 좋겠습니다.

kddh1의 이미지

아래 상속클래스에서 virtual 키워드를 모조리 빼버리고 virtual이 붙어있는 메소드들을 모두 선언해버렸습니다.
그러고나니까 추상기본클래스라서 못만들어주겠다는 소리 대신 아래같은
오류가 뜨네요;; 한단계 발전한게 맞는건지-_- 모르겠군요.

class Child:public Reader { 
public: 
   메쏘드1();       <-- 원래는 virtual 메쏘드1(); 이었지요.
   메쏘드2();       <-- virtual 메쏘드2() 였습니다.
   메쏘드3(); 
~~~생략 메쏘드10()까지~~
}; 
  ~~ 생략~~~
int main()
{
 Child *var = new Child();   <-- 이게 에러를 냅니다.
}

상속 클래스에 선언해둔 메쏘드들은 헤더파일에 있던 그대로 적었습니다.
그외에는 cpp같은곳에서 따로 메소드에 대한 정의를 하지는 않았습니다. 라이브러리안에 정의되어있겠지요 그리고-_-;; 해당함수 원소스를 모르니깐요..;; 커다랗게 저런 형태입니다.
g++ -c 옵션으로 .o는 잘만들어지니다. 근데 -o옵션 붙이고 링크시 에러가
나는듯합니다-_-;;; hey님께서 말씀하신게 현실로...T-T
어느줄이 에러났다는 소리도 없고-_- 그냥 Child *var=new Child();문장을
주석처리하면 에러가 안난다는것정도입니다.
에러 메시지는..
-------Err-----------
/tmp/ccgxdP9G.o(.text+0x2b): In function 'main':
:undefined reference to 'Child::Child[in-charge]()'
collect2: ld returned 1 exit status
------------end---------------
이런에러네요 g++옵션에 링크도 제대로 넣었고요;;
이메시지는 Child::Child[in-charge]()를 라이브러리파일안에서 찾을려고 하는듯한데-_-; 사용자정의 상속클래스인데-_- 라이브러리에서 찾아봐야 없는건데T-T; 근데 웃긴건
저는 상속클래스인 Child에서 저런 메서드를 적은기억이없습니다.
왜 멋대로 저런걸 불러버리는걸까요...

라이브러리 파일을 nm으로 뒤적거리다가 이상한걸 봤습니다-_-
00009d16 T Reader::Reader[in-charge]()
00009c8c T Reader::Reader[not-in-charge]()
이것과 관련이 있을려나;;;

그리고 혹시나 하는건데 라이브러리의 버전 호환성;; 아니길바라지만 이거랑 상관이 있을런지요. 라이브러리 이름에 버전을 적는것으로 알고있는데.. .so가.. libILR_sdk-i386-gcc3-0.4.5.so랍니다
이건 gcc3 이면 다 된다는이야기일까요?

kddh1의 이미지

아 정말 뭐가 문제이지.. OS는 레드헷9.0에 gcc버전은 3.2.2입니다.
왠지 하나가 풀렸다는 생각이 들면 하나가 꼬이네요쩝.

hey의 이미지

음. 해당 에러 메시지는, 컴파일 때는 문제가 없었지만 링크할 때 실제 함수 정의를 찾아보니 없더라, 는 내용입니다. Child::Child가 없다는 걸 보니 생성자를 선언만 하시고 정의는 하지 않으신 것 같습니다. 생성자니까 new 할 때 사용되는 거지요.

밤 새셨나요? 글이 아침 일찍 올라왔네요.


----------------------------
May the F/OSS be with you..


kddh1의 이미지

#include <iostream>
#include <mini.h>

using namespace std;

class Child:public Reader {
};

class Child2:public CardIII{
};

int main()
{
Child *var=new Child();
Child2 *var2 = new Child2();
bool pReader;
var->Connect(1);
pReader=var->IsConnect();
if(pReader==true)
  cout << "Comm Port already open" <<endl;
 else
  cout << "Comm Port Close" <<endl;
}

대략 이정도로 해버렸습니다 선언문을 아예 다 빼버렸지요;;
virtual 함수를 다 나열해줘도 제대로 안되길래요..
저렇게하니까 인스턴스는 만들어지네요;;
함수호출도 되는것같기두 하고 컴파일과 링크 에러도안나는데;;
제대로된 코드라고 볼수있는걸까요? 정작 카드하고의 통신은 여전히 안되지만--;

doldori의 이미지

이렇게 한다면 굳이 Child 클래스가 필요없지 않습니까? 그냥 Reader를 직접 쓰는
거나 차이가 없지요. 앞에서 쓰신 내용으로 보아 이 코드가 컴파일이 됐다면
Child 뿐만 아니라 Reader 클래스도 손을 보셨겠군요.

어떤 일을 하시려는지는 몰라도 이런 식으로 해결이 될 것 같지는 않습니다.
C++ 문법과 Reader 클래스의 사용법 모두 확실히 알지 못하는 상태에서
이것저것 시도하시나 본데, 기본적인 내용을 먼저 익히시는 게 나을 것 같네요.
보기에 안타까워서 주제넘은 말씀 드렸습니다.

kddh1의 이미지

Reader클래스는 라이브러리안에 있는것이기때문에 손을 대고 싶어도T-T
못댑니다.. 근데 저렇게라도 상속을 안해놓으면 바로 인스턴스가 되지않더라구요. virtual 때문이지요.;; 아주 잘은 아니지만 클래스도 알고있습니다 조금-_-;; 지금하는일이 시간을 다투는 일이고 가진자료가 거의 전무하다시피해서 그냥 이것저것 다해보게 되네요T-T.. 어렵네요 하드웨어 제어라는것은..
doldori 감사합니다.

댓글 달기

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