`vtable에 대한 이상한 정의되지 않은 참조

쉬 후이

나는 "undefined reference to vtable..."하루 종일 갇혀 있었다.

사실 저는 많은 답변이 "undefined reference to vtable..."

예를 들면 :

vtable "트랜잭션"에 대한 정의되지 않은 참조

vtable에 대한 정의되지 않은 참조

https://gcc.gnu.org/faq.html#vtables

vtable에 대한 정의되지 않은 참조

어떤 사람들의 문제는 가상 함수를 작성하는 것을 잊고 다른 사람들은 .cpp 파일을 빌드 디렉토리에 추가하는 것을 잊었습니다. 그러나 나는 그것을 눈치 채고 있다고 생각합니다.

다음 단계를 수행하고 싶습니다.

  • 나는 컴파일 클래스 A_1A_2공유 라이브러리를 원합니다 libA. A_2에서 파생됩니다 A_1.

A_1.h

#ifndef include_A_1_h
#define include_A_1_h
class A_1
{
public:
    A_1() {}
    virtual ~A_1() {} // not pure-virtual function has defined
    virtual void print() = 0;

private:
};
#endif

A_2.h

#ifndef include_A_2_h
#define include_A_2_h
#include "A_1.h"

class A_2 : public A_1
{
public:
    A_2() {}
    ~A_2() {}
    virtual void print();

private:
};
#endif

A_2.cpp

#include "A_2.h"

void A_2::print()
{
    // empty
}
  • 나는 컴파일 클래스 B_1B_2공유 라이브러리를 원합니다 libB. B_1B_2독립적이다.

B_1.h

#ifndef include_B_1_h
#define include_B_1_h

#include <iostream>
#include <string.h>

class B_1
{
public:
    B_1(const std::string &path);
    ~B_1();

private:
};
#endif

B_1.cpp

#include "B_1.h"

B_1::B_1(const std::string &path)
{
}

B_1::~B_1()
{
}

B_2.h

#ifndef include_B_2_h
#define include_B_2_h

class B_2
{
public:
    B_2() {}
    ~B_2() {}
    void fun();

    private:
    };

#endif

B_2.cpp

#include "B_2.h"
#include "A_1.h"
#include "A_2.h"

void B_2::fun()
{
    A_1 *ptr = new A_2;
}
  • .NET에서 두 개의 공유 라이브러리를 사용하고 싶습니다 main.cpp. 여기에서 뭔가 잘못되었습니다.

main.cpp

#include "B_1.h"
int main()
{
    B_1 b1("name");
}

다음 명령을 사용하여 컴파일하고 있습니다.

g++ A_2.cpp -fPIC -shared -o libA.so
g++ B_1.cpp B_2.cpp -fPIC -shared -o libB.so
g++ main.cpp -L . -lA -lB

컴파일러는 다음과 같이 말했습니다.

./libB.so: undefined reference to `vtable for A_2'

관련없는 코드를 무시하기 때문에 많은 빈 함수를 볼 수 있습니다. 하지만이 경우에도 여전히 오류가 있습니다.

아무도 나를 도울 수 있습니까? 감사.

뇌물

라이브러리 B를 컴파일 할 때 공유 라이브러리 A도 제공하십시오.

g++ B_1.cpp B_2.cpp  -L . -lA  -fPIC -shared -o libB.so

간단히 말해서 (저는 주제에 대한 전문가가 아닙니다), g ++에서 사용하는 ld 링커는 정의되지 않은 기호를보고하는 것입니다. main을 컴파일 할 때 libB에서 해결되지 않은 기호는 libA를 제공하여 해결되지 않습니다. 이는 main에서 명시 적 으로 사용하는 모든 기호 가 libB를 사용하여 해결 되기 때문 입니다.

기본적으로 :

  • 실행 파일을 컴파일 할 때 정의되지 않은 기호가 있으면 ld가 실패합니다.
  • 라이브러리를 컴파일 할 때 정의되지 않은 기호가 있으면 ld가 실패하지 않습니다.

나중에는 많은 유연한 작업을 수행 할 수 있습니다. 그 중에는 라이브러리 간의 순환 종속성이 있습니다 (여기서 libA는 libB에도 의존 할 수 있음).

두 번째 단계에서 실패하려면을 사용하여 정의되지 않은 기호가있는 경우 링커에 실패하도록 명시 적으로 알려야합니다 -z defs.

g++ B1.cpp B2.cpp -z defs -fPIC -shared -o libB.so

/tmp/cchjkdnAk.o : A_2::A_2()': B2.cpp:(.text._ZN3A_2C2Ev[_ZN3A_2C5Ev]+0x1b): undefined reference to A_2 'collect2에 대한 vtable 함수에서 : 오류 : ld가 1 종료 상태를 반환했습니다.

main.cpp가 다음과 같이 작성 되었다면 컴파일 지시문이 작동했을 것입니다.

#include "A_2.h"
#include "B_1.h"
int main()
{
    A_1 *ptr = new A_2;
    B_1 b1("name");
}

libA는 main의 기호를 해결하기 위해로드되었을 것이며, 해당 기호는 libB의 누락 된 기호에 사용되었을 것입니다.

더 많은 정보를 원하시면 : 리눅스 저널에 심볼 해상도에 대해 더 자세히 설명하는 멋진 기사가 있습니다.

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

정적 constexpr char []에 대한 정의되지 않은 참조

vtable에 대한 정의되지 않은 참조

gtest의 testing :: internal :: EqFailure에 대한 정의되지 않은 참조

vtable 오류에 대한 정의되지 않은 참조는 최신 g ++ 컴파일러로 해결됩니까?

Eclipse CDT의 함수에 대한 정의되지 않은 참조

정적 constexpr에 대한 정의되지 않은 참조

`vtable for MainWindow '에 대한 정의되지 않은 참조

yyparse의`pow '에 대한 정의되지 않은 참조

C ++ 상속 문제 : 'vtable'에 대한 정의되지 않은 참조

생성 된 코드에서 vtable에 대한 Apache Thrift 정의되지 않은 참조

"<class>에 대한 typeinfo"에 대한 정의되지 않은 참조

clang의 소멸자에 대한 정의되지 않은 참조

생성자 및 소멸자에 대한 vTable에 대한 정의되지 않은 참조

정적 함수에 대한 정의되지 않은 참조

정적 함수에 대한 정의되지 않은 참조

`vtable for Msnger '에 대한 Qt 정의되지 않은 참조

Ubuntu의 OpenGL에 대한 정의되지 않은 참조

모든 가상 기능이 구현 된 vtable에 대한 정의되지 않은 참조

정적 constexpr char [] []에 대한 정의되지 않은 참조

`vtable for CollidingMice '에 대한 정의되지 않은 참조보기

Qt : 'vtable'에 대한 정의되지 않은 참조

pthread의 러너에 대한 정의되지 않은 참조

`yylex '에 대한 정의되지 않은 참조 &&`yyin'에 대한 정의되지 않은 참조

Qt C ++ Q_OBJECT 오류 vtable에 대한 정의되지 않은 참조

C ++ Code :: morsecode ()에 대한 정의되지 않은 참조 및 Code :: alphacode ()에 대한 정의되지 않은 참조

ROS CPP의 google :: protobuf에 대한 정의되지 않은 참조

Qt Quick + CMake + 사용자 정의 QObject는 `vtable'에 대한 정의되지 않은 참조를 생성합니다.

Number에 대한 vtable에 대한 정의되지 않은 참조

vtable CMake 빌드 문제에 대한 Qt5 정의되지 않은 참조

TOP 리스트

  1. 1

    JNDI를 사용하여 Spring Boot에서 다중 데이터 소스 구성

  2. 2

    std :: regex의 일관성없는 동작

  3. 3

    JSoup javax.net.ssl.SSLHandshakeException : <url>과 일치하는 주체 대체 DNS 이름이 없습니다.

  4. 4

    PrematureCloseException : 연결이 너무 일찍 닫혔습니다.

  5. 5

    Xcode10 유효성 검사 : 이미지에 투명성이 없지만 여전히 수락되지 않습니까?

  6. 6

    정점 셰이더에서 카메라에서 개체까지의 XY 거리

  7. 7

    Ionic 2 로더가 적시에 표시되지 않음

  8. 8

    Seaborn에서 축 제목 숨기기

  9. 9

    C #에서 'System.DBNull'형식의 개체를 'System.String'형식으로 캐스팅 할 수 없습니다.

  10. 10

    복사 / 붙여 넣기 비활성화

  11. 11

    ArrayBufferLike의 typescript 정의의 깊은 의미

  12. 12

    Google Play Console에서 '예기치 않은 오류가 발생했습니다. 나중에 다시 시도해주세요. (7100000)'오류를 수정하는 방법은 무엇입니까?

  13. 13

    Kubernetes Horizontal Pod Autoscaler (HPA) 테스트

  14. 14

    jfreecharts에서 x 및 y 축 선을 조정하는 방법

  15. 15

    PRNG 기간보다 순열이 더 많은 목록을 무작위로 섞는 방법은 무엇입니까?

  16. 16

    C # HttpWebRequest 기본 연결이 닫혔습니다. 전송시 예기치 않은 오류가 발생했습니다.

  17. 17

    다음 컨트롤이 추가되었지만 사용할 수 없습니다.

  18. 18

    잘못된 구성 개체입니다. Webpack이 Angular의 API 스키마와 일치하지 않는 구성 개체를 사용하여 초기화되었습니다.

  19. 19

    Android Kotlin은 다른 활동에서 함수를 호출합니다.

  20. 20

    R의 마침표와 숫자 사이에 문자열 삽입

  21. 21

    Assets의 BitmapFactory.decodeStream이 Android 7에서 null을 반환합니다.

뜨겁다태그

보관