문제

C++ 과정을 위한 소규모 클래스 라이브러리를 작성하려고 합니다.

내 공유 개체에 클래스 집합을 정의한 다음 라이브러리를 시연하는 기본 프로그램에서 직접 사용할 수 있는지 궁금합니다.어떤 트릭이 포함되어 있습니까?C++ 클래스는 일반 클래스가 아닌 MFC .dll에서만 작동하지만 이는 단지 Windows 측일 뿐이라는 내용을 오래 전에(실제로 프로그래밍을 시작하기 전에) 읽었던 기억이 납니다.

도움이 되었습니까?

해결책

C++ 클래스는 .so 공유 라이브러리에서 잘 작동합니다(Windows의 MFC가 아닌 DLL에서도 작동하지만 실제로는 그런 질문이 아닙니다).라이브러리에서 기호를 명시적으로 내보낼 필요가 없기 때문에 실제로 Windows보다 쉽습니다.

이 문서는 귀하의 질문에 대한 대부분의 답변을 제공합니다. http://people.redhat.com/drepper/dsohowto.pdf

기억해야 할 주요 사항은 -fPIC 컴파일할 때의 옵션과 -shared 링크할 때 옵션입니다.인터넷에서 많은 예를 찾을 수 있습니다.

다른 팁

내 솔루션/테스트

내 솔루션은 다음과 같습니다. 예상한 대로 작동합니다.

암호

고양이.아아 :

#include <string>

class Cat
{
    std::string _name;
public:
    Cat(const std::string & name);
    void speak();
};

cat.cpp :

#include <iostream>
#include <string>

#include "cat.hh"

using namespace std;

Cat::Cat(const string & name):_name(name){}
void Cat::speak()
{
    cout << "Meow! I'm " << _name << endl;
}

메인.cpp :

#include <iostream>
#include <string>
#include "cat.hh"

using std::cout;using std::endl;using std::string;
int main()
{
    string name = "Felix";
    cout<< "Meet my cat, " << name << "!" <<endl;
    Cat kitty(name);
    kitty.speak();
    return 0;
}

편집

먼저 공유 lib를 컴파일합니다.

$ g++ -Wall -g -fPIC -c cat.cpp
$ g++ -shared -Wl,-soname,libcat.so.1 -o libcat.so.1 cat.o

그런 다음 라이브러리의 클래스를 사용하여 기본 실행 파일 또는 C++ 프로그램을 컴파일합니다.

$ g++ -Wall -g -c main.cpp
$ g++ -Wall -Wl,-rpath,. -o main main.o libcat.so.1 # -rpath linker option prevents the need to use LD_LIBRARY_PATH when testing
$ ./main
Meet my cat, Felix!
Meow! I'm Felix
$

내가 이해하는 바에 따르면, 모두 동일한 컴파일러를 사용하여 컴파일된 .so 파일을 연결하는 한 괜찮습니다.다양한 컴파일러는 다양한 방식으로 기호를 조작하므로 연결에 실패합니다.

이는 Windows에서 COM을 사용할 때의 장점 중 하나이며 OOP 개체를 DLL에 넣기 위한 표준을 정의합니다.GNU g++를 사용하여 DLL을 컴파일하고 이를 MSVC 또는 심지어 VB로 컴파일된 EXE에 연결할 수 있습니다!

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top