[英]DLL dependency to static library
我目前为客户构建一个纯静态的 MainLib
库,其中包含所有符号,以便他们可以将其集成到他们的程序中。 由于多种原因,我现在需要提供MainLib
的DLL版本 ,其中包含部分符号以及包含其余符号的静态库 FeatureLib
。 原因之一是我们希望通过简单地窃取通过客户程序提供的DLL来避免恶意软件的使用。 如果部分符号通过静态库集成在调用软件中,则无法使用。 软件包的用户只有在将FeatureLib
的符号添加到其应用程序后才能使用DLL。
对于Linux,我可以使其看起来像一个吊饰,即符号doFeature()
不在libMainLib.so
内,但在Windows上无法成功实现。
CMakeLists.txt
:
cmake_minimum_required(VERSION 3.0)
project(MainLib)
add_library(FeatureLib STATIC src/FeatureLib.c)
target_include_directories(FeatureLib PUBLIC include
PRIVATE src)
add_library(MainLib SHARED src/MainLib.c)
target_include_directories(MainLib PUBLIC include
PRIVATE src)
# I don't want to include symbols from FeatureLib into shared MainLib
#target_link_libraries(MainLib PRIVATE FeatureLib)
add_executable(MainLibDemo src/demo.c)
target_link_libraries(MainLibDemo MainLib FeatureLib) #resolve symbol doFeature()
FeatureLib.h
:
extern int doFeature(int input);
MainLib.h
:
extern __declspec(dllexport) int MainLib(int input);
FeatureLib.c
:
#include "FeatureLib.h"
int doFeature(int input) {return 4;}
MainLib.c
:
#include "FeatureLib.h"
#include "MainLib.h"
__declspec(dllexport) int MainLib(int input)
{
if (input > 2) {
return doFeature(input);
} else {
return doFeature(0);
}
}
demo.c
:
#include <stdio.h>
#include <stdlib.h>
#include "MainLib.h"
int main(int argc, char **argv)
{
if(argc > 1)
return MainLib(atoi(argv[1]));
else
return 0;
}
这样,我得到以下编译错误:
"C:\Daten\tmp\DemoProject\simple\build\ALL_BUILD.vcxproj" (Standardziel) (1) ->
"C:\Daten\tmp\DemoProject\simple\build\MainLib.vcxproj" (Standardziel) (4) ->
(Link Ziel) ->
MainLib.obj : error LNK2019: unresolved external symbol _doFeature referenced in function _MainLib [C:\Daten\tmp\DemoProject\simple\build\MainLib.vcxproj]
C:\Daten\tmp\DemoProject\simple\build\Debug\MainLib.dll : fatal error LNK1120: 1 unresolved externals [C:\Daten\tmp\DemoProject\simple\build\MainLib.vcxproj]
0 Warnung(en)
2 Fehler
Windows甚至可以做到吗? 除了不将FeatureLib
链接到MainLibDemo
之外,我必须做些什么才能使其正常工作以及如何进行验证。 任何想法都非常欢迎。
亲切的问候,弗洛里安
在Linux下执行此操作的方法在Windows下将不起作用,因为动态链接在这里的工作方式有所不同。 这是一种可行的策略。
在MainLib.dll
代码中,需要直接定义适当的函数指针类型的全局指针变量,然后使用它来调用函数,而不是直接调用doFeature
。 这将允许构建MainLib.dll
而不会出现错误。
现在,您需要设置此指针变量。 一种方法是:
将导出的函数添加到MainLib.dll
,该函数采用指向DLL需要可执行文件中所有函数的指针。
在FeatureLib.lib
代码中,添加一个初始化函数,应用程序在使用DLL之前将需要调用该函数,该函数会将指向其对等点的指针传递给DLL。
基本上,这是大多数带有插件的程序用来使插件访问其设施的方式。
另一种方法是(警告!我尚未测试此特定解决方案):
在FeatureLib.lib
声明通过__declspec(dllexport)
导出的功能。 这样,它们将从可执行文件中导出。
在MainLib.dll
在首次使用指针之前,请先使用GetModuleHandle
和GetProcAddress
获取指针。 最好在库的某些初始化函数中完成。 否则,您需要注意避免出现竞赛情况。
希望这会有所帮助。 虽然我认为您的复制保护方案不起作用。 Andrew Henle的评论是正确的:从一个可执行文件中提取所需的代码并将其包含在另一个可执行文件中并不难。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.