1

如果我有一个将被编译为共享对象的类。该类在 .h 文件中声明并在 .cpp 文件中实现。

这个类包含几个内联方法

如果我编写了一些与此共享库链接并包含 .h 文件的程序,则在链接它时会出现未定义的引用错误。

那是因为没有为内联方法导出符号吗?

我是否正确理解这一点?

更新:下面的一些示例代码

一些lib.h

#ifndef __ABC_LIB_H
#define __ABC_LIB_H
#include <iostream>
class ABC {
    ABC();
    ~ABC();
    inline void not_callable_outside_library();
    void callable_outside_library();
};
#endif

一些lib.cpp

#include "somelib.h"
ABC::ABC() {}
ABC::~ABC() {}
void ABC::not_callable_outside_library(){ std::cout<<"not_callable_outside_library"<<std::endl; }
void ABC::callable_outside_library(){ std::cout<<"callable_outside_library"<<std::endl; }

程序.cpp

#include "somelib.h"
int main() {
    ABC x;
    x.not_callable_outside_library();
    return 0;
};

将 somelib.cpp 编译为共享库( .so 对象)并将其链接到 program.cpp ,然后您将获得名为program的二进制文件。

现在你应该在链接时得到一个未定义的引用。

4

1 回答 1

6

内联函数必须在头文件中定义。将您拥有的内容与以下内容进行对比:

一些lib.h:

#ifndef ABC_LIB_H
#define ABC_LIB_H

#include <iostream>
class ABC {
    ABC();
    ~ABC();
    void not_callable_outside_library();
    void callable_outside_library();
};

inline void ABC::not_callable_outside_library() {
    std::cout << "not_callable_outside_library\n";
}

#endif

一些lib.cpp:

#include "somelib.h"

ABC::ABC() { }
ABC::~ABC() { }
void ABC::callable_outside_library() {
    std::cout << "callable_outside_library\n";
}

程序.cpp:

#include "somelib.h"

int main() {
    ABC x;
    x.not_callable_outside_library();
}
于 2012-08-06T04:55:52.270 回答