DLL对静态库的依赖

时间:2018-10-16 08:59:21

标签: c visual-studio dll cmake linker

我目前为客户建立了一个纯静态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以外,我需要做些什么来使其能够工作以及如何验证它。任何想法都非常欢迎。

亲切的问候, 弗洛里安

1 个答案:

答案 0 :(得分:0)

在Linux下执行此操作的方式在Windows下不起作用 因为动态链接在这里的工作方式有所不同。 这是一种可行的策略。

MainLib.dll代码中,而不是直接调用doFeature 您需要定义适当功能的全局指针变量 指针类型并使用它来调用函数。 这样将可以毫无错误地构建MainLib.dll

现在,您需要设置此指针变量。一种方法是:

  • 将导出的函数添加到需要指针的MainLib.dll DLL需要可执行文件中的所有功能。

  • FeatureLib.lib代码中添加初始化函数 该应用程序需要在使用之前调用 您的DLL,它将把指向其对等对象的指针传递给DLL。

基本上,这是大多数带有插件的程序用来 允许插件访问其设施。

另一种方法是(警告!我尚未测试此特定 解决方案):

  • FeatureLib.lib中将函数声明为已导出 与__declspec(dllexport)。这样他们将被导出 来自可执行文件。

  • MainLib.dll中,在第一次使用指针之前使用 GetModuleHandleGetProcAddress获取指针。 最好在某些初始化函数中完成 图书馆。否则,您需要注意避免出现比赛情况。

希望这会有所帮助。 虽然我认为您的复制保护方案不起作用。 安德鲁·亨利(Andrew Henle)在他的评论中是对的:这并不难 从一个可执行文件中提取所需的代码并将其包括在内 在另一个。