如何在静态库中实现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;
}
在我的例子中,函数foo1
和foo2
是由两个不同的人实现的。由于某些原因,我需要隐藏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
我有一个像这样的 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;
}
在我的例子中,函数foo1
和foo2
是由两个不同的人实现的。由于某些原因,我需要隐藏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