[英]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.