导出 visual studio c++ 项目以用于另一个项目,但不显示 .cpp 和 .h 源文件
Exporting a visual studio c++ project for use in another project, without revealing the .cpp and .h source files
我有一个名为
的 visual studio 项目
"TopSecretProject"
我想与匿名开发人员用户共享,而不泄露我的任何代码,包括 header 文件(因为我的 .h
文件包含我的项目结构,用户无法了解它)。
用户应该收到:
- 他可能调用的函数名称列表(取决于用户拥有的权限)并且用户应该能够使用这些函数作为黑盒开发程序。
- 我的封
TopSecretProject
,他打不开
这种情况有可能吗?
我尝试了以下解决方案但失败了:
- 正在导出
TopSecretProject
作为静态库。
- 正在为用户创建一个新的 VS 项目,并将
.lib
添加到用户项目中。
- 正在将所有 .h 文件复制到用户的项目并创建一个预编译的 header 文件。
- 删除 header(现在我有了
.pch
,我不再需要它们了)
预编译的 header 在任何 运行 中重建,因此删除了我的第一个预编译的 pch...我也尝试直接从 TopSecretProject
复制 pch 但它没有帮助。
非常感谢!!
pre-compiledheader中的任何导出函数声明,无论您是否希望最终用户能够调用它们,都可以很容易地从 pch(或库)中提取, 对于这个问题)。尝试交付 pre-compiled header 只会让自己头疼。 :-)
相反,如何专门为最终用户创建一个 header 文件,其中声明了您希望他们可以使用的功能?缺点是您必须为每组权限创建一个 header 文件(尽管这比为每组权限指定可用功能更难吗?)
但是请注意,如果任何人想尝试使用该库的其他功能,他们仍然可以查看您库的导出符号。
编辑:
关于 classes,如果你真的不想给出 class 声明,你就必须在 class 之上实现一些层以供他们交互。没有办法解决这个问题。这可能意味着两条路径之一:
一:您可以声明一些用于创建、销毁和使用您的 classes 的函数,并只传回一些好的 ole' void * 指针。例如
typedef void * MySecretClass;
MySecretClass initializeMSC( ... );
void freeMSC( MySecretClass cls );
int useMSC( MySecretClass cls, int param, ... );
二:你可以创建一个包装器class,它基本上做同样的事情。
class MySecretClassWrapper
{
public:
MySecretClassWrapper( void );
int useClass( int param );
private:
void * mySecretClassData; // <-- actual class instantiated here
};
编译后的定义:
MySecretClassWrapper::MySecretClassWrapper( void ) {
mySecretClassData = reinterpret_cast<void *>(new MySecretClass);
}
int MySecretClassWrapper::useClass( int param ) {
MySecretClass * object = reinterpret_cast<MySecretClass *>(mySecretClassData);
return object ? object->useClass(param) : -1;
}
第一个是我在使 C++ classes 可用于 C 应用程序时使用的方法。第二个是完全相同的想法,但包含在 class 中,这对于 C++ 用户来说更容易使用。
我有一个名为
的 visual studio 项目"TopSecretProject"
我想与匿名开发人员用户共享,而不泄露我的任何代码,包括 header 文件(因为我的 .h
文件包含我的项目结构,用户无法了解它)。
用户应该收到:
- 他可能调用的函数名称列表(取决于用户拥有的权限)并且用户应该能够使用这些函数作为黑盒开发程序。
- 我的封
TopSecretProject
,他打不开
这种情况有可能吗?
我尝试了以下解决方案但失败了:
- 正在导出
TopSecretProject
作为静态库。 - 正在为用户创建一个新的 VS 项目,并将
.lib
添加到用户项目中。 - 正在将所有 .h 文件复制到用户的项目并创建一个预编译的 header 文件。
- 删除 header(现在我有了
.pch
,我不再需要它们了)
预编译的 header 在任何 运行 中重建,因此删除了我的第一个预编译的 pch...我也尝试直接从 TopSecretProject
复制 pch 但它没有帮助。
非常感谢!!
pre-compiledheader中的任何导出函数声明,无论您是否希望最终用户能够调用它们,都可以很容易地从 pch(或库)中提取, 对于这个问题)。尝试交付 pre-compiled header 只会让自己头疼。 :-)
相反,如何专门为最终用户创建一个 header 文件,其中声明了您希望他们可以使用的功能?缺点是您必须为每组权限创建一个 header 文件(尽管这比为每组权限指定可用功能更难吗?)
但是请注意,如果任何人想尝试使用该库的其他功能,他们仍然可以查看您库的导出符号。
编辑:
关于 classes,如果你真的不想给出 class 声明,你就必须在 class 之上实现一些层以供他们交互。没有办法解决这个问题。这可能意味着两条路径之一:
一:您可以声明一些用于创建、销毁和使用您的 classes 的函数,并只传回一些好的 ole' void * 指针。例如
typedef void * MySecretClass;
MySecretClass initializeMSC( ... );
void freeMSC( MySecretClass cls );
int useMSC( MySecretClass cls, int param, ... );
二:你可以创建一个包装器class,它基本上做同样的事情。
class MySecretClassWrapper
{
public:
MySecretClassWrapper( void );
int useClass( int param );
private:
void * mySecretClassData; // <-- actual class instantiated here
};
编译后的定义:
MySecretClassWrapper::MySecretClassWrapper( void ) {
mySecretClassData = reinterpret_cast<void *>(new MySecretClass);
}
int MySecretClassWrapper::useClass( int param ) {
MySecretClass * object = reinterpret_cast<MySecretClass *>(mySecretClassData);
return object ? object->useClass(param) : -1;
}
第一个是我在使 C++ classes 可用于 C 应用程序时使用的方法。第二个是完全相同的想法,但包含在 class 中,这对于 C++ 用户来说更容易使用。