【发布时间】:2018-10-16 08:59:20
【问题描述】:
我目前为我们的客户构建了一个纯静态库MainLib,其中包含所有符号,以便他们可以将其集成到他们的程序中。出于多种原因,我现在需要提供 DLL 版本 的 MainLib,其中包含部分符号与包含剩余符号的静态库 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 之外,我如何验证它。任何想法都非常受欢迎。
亲切的问候, 弗洛里安
【问题讨论】:
-
关于如何解决这个问题的任何想法?
-
您至少需要编辑您的帖子以显示“我在 Windows 上没有成功”的含义。
-
感谢您的评论迈克。我在描述中添加了构建错误消息。
-
您的问题有不一致的地方。你的
CMakeLists.txt说MainLib是从C++ 源代码src/MainLib.cpp构建的,但后来你说doFeature在C 源代码MainLib.c中被调用,错误消息表明MainLib.obj是从C 编译的,而不是C++ ,因为对_doFeature的未解析引用尚未被命名。最好提供minimal reproducible example。 -
感谢迈克的反馈。我更新了描述,所以它只包含 C 代码并且是完整的。我希望它现在满足最小、完整和可验证的要求。给您带来的不便,我们深表歉意。
标签: c visual-studio dll cmake linker