如何在静态库中实现Class的部分成员函数,而其余函数在cpp文件中实现?

How to implement parts of member functions of a Class in a static library while the rest functions implemented in a cpp file?

我有一个像这样的 C++ Class A:

// in header file A.h
class A
{
public:
    void foo1();
    void foo2();
private:
    double m_a;
};


// in cpp file A1.cpp
void A::foo1(){
    m_a = 0;  //do something with m_a
}

// in cpp file A2.cpp
void A::foo2(){
    foo1();  // call foo1
}

// in cpp file main.cpp
int main(){
    A obj;
    obj.foo2();
    return 0;
}

在我的例子中,函数foo1foo2是由两个不同的人实现的。由于某些原因,我需要隐藏foo1的实现,这样编码A2.cpp的人就无法获取foo1的源代码,同时他可以使用[=13] =] 在他自己的应用程序中(如上面的 main.cpp)。

我尝试将 A1.cpp 存档为静态库,当然,foo2 发生了 'unresolved external symbol' 错误。

我在 Visual Studio 2019 年使用 CMake 插件构建了我的静态库,我的 CMakeLists.txt 就像:

add_library (my_lib STATIC A1.cpp)
target_include_directories(my_lib PUBLIC path/to/A.h)

是否有针对此问题的任何解决方案或变通方法?

您可以编译 A1.cpp 而无需 linking,这将为您提供一个已编译的目标文件 A1.o。您可以将其移交,这样 A2.cpp 的开发人员将无法看到源代码,但可以 link 您的目标文件来构建最终项目。

对于 g++,它看起来像:

A.h

class A
{
public:
    void foo1();
    void foo2();
private:
    double m_a;
};

A1.cpp

#include "A.h"
#include <iostream>

void A::foo1() {
    std::cout << "foo1 called!" << std::endl;
    m_a = 72;
}

A2.cpp

#include "A.h"
#include <iostream>

void A::foo2() {
    std::cout << "foo2 called!" << std::endl;
    foo1();
}

main.cpp

#include "A.h"

int main() {
    A a;
    a.foo2();
}

构建项目

如果您使用的是 g++,那么...

g++ -c A1.cpp

这将编译但不会 link A1.cpp,为您提供目标文件 A1.o。您可以将该文件移交,以便其他开发人员可以使用

构建整个项目
g++ main.cpp A1.o A2.cpp