В настоящее время я создаю для наших клиентов чисто статическую библиотеку MainLib
, которая содержит все символы, чтобы они могли интегрировать ее в свою программу.По нескольким причинам мне теперь нужно доставить версию DLL из MainLib
, которая содержит части символов вместе со статической библиотекой FeatureLib
, которая содержит оставшиеся символы.Одна из причин заключается в том, что мы хотим избежать использования нашего программного обеспечения плохими парнями, просто крадя библиотеку DLL, которая предоставляется программой нашего клиента.Это не будет работать, если части символов интегрированы в вызывающее программное обеспечение через статическую библиотеку .Пользователь пакета может использовать DLL только в том случае, если он добавил символы FeatureLib
в свое приложение.
Для 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
.Любые идеи приветствуются.
С уважением, Флориан