C++ - 解决使用静态和动态库时的链接器错误
C++ - Resolve linker error when working with static and dynamic libraries
我正在寻找一组开发人员可以使用的库,他们可以决定是否要将它们用作动态库或静态库。当然,这带来了几个复杂的问题,当前是符号解析。在我的测试代码中,我有 3 个项目:可执行项目、静态项目和动态项目。顾名思义,静态项目编译成.lib,动态项目编译成.dll。
静态项目包括动态项目代码的头文件,并调用函数DynamicFunction
,这意味着它会在编译时尝试link到这个函数。但是,正在编译到共享库中的动态项目不可用,并且它不link。有没有办法让我在三个项目中的任何一个中定义函数来解决这个问题?
我的测试代码如下:
main.cpp - 编译为可执行文件
#include <Windows.h>
#include "../static/static.h"
using proc = void(*)();
proc p = 0;
// I tried using this to force there to be a DynamicFunction function to link with,
// But since they're in different compilation units, it doesn't quite work.
void DynamicFunction() {
if (p) {
p();
}
}
int main(int argc, char** argv) {
HMODULE dll = LoadLibrary("dynamic");
proc p = (proc)GetProcAddress(dll, "DynamicFunction");
UseDynamic();
}
Static.h
#pragma once
void UseDynamic();
Static.cpp
#include "../dynamic/dynamic.h"
#include "static.h"
void UseDynamic() {
DynamicFunction();
}
dynamic.h
#pragma once
extern "C" __declspec(dllexport) void DynamicFunction();
dynamic.cpp
#include "dynamic.h"
void DynamicFunction() {}
我知道错误源于 UseDynamic
假设函数也是静态定义的,但我不知道有什么方法可以让它知道函数是否是静态的或者在不知道如何使用另一个库的情况下动态,甚至它可能会涉及一些丑陋的预处理器条件。
是否可以做我想做的事情,或者我需要决定是静态库还是动态库(或者至少,不允许混合使用两者)
编辑:我正在使用 Visual Studio 2017
当您在 Visual Studio 中构建 DLL 项目时,它会与 DLL 一起构建静态导入库。该库包含您的 DLL 导出的函数的 shim 定义,这些函数将负责从 DLL 加载它们。将测试可执行文件链接到 DLL 的导入库应该可以正常工作。
我正在寻找一组开发人员可以使用的库,他们可以决定是否要将它们用作动态库或静态库。当然,这带来了几个复杂的问题,当前是符号解析。在我的测试代码中,我有 3 个项目:可执行项目、静态项目和动态项目。顾名思义,静态项目编译成.lib,动态项目编译成.dll。
静态项目包括动态项目代码的头文件,并调用函数DynamicFunction
,这意味着它会在编译时尝试link到这个函数。但是,正在编译到共享库中的动态项目不可用,并且它不link。有没有办法让我在三个项目中的任何一个中定义函数来解决这个问题?
我的测试代码如下:
main.cpp - 编译为可执行文件
#include <Windows.h>
#include "../static/static.h"
using proc = void(*)();
proc p = 0;
// I tried using this to force there to be a DynamicFunction function to link with,
// But since they're in different compilation units, it doesn't quite work.
void DynamicFunction() {
if (p) {
p();
}
}
int main(int argc, char** argv) {
HMODULE dll = LoadLibrary("dynamic");
proc p = (proc)GetProcAddress(dll, "DynamicFunction");
UseDynamic();
}
Static.h
#pragma once
void UseDynamic();
Static.cpp
#include "../dynamic/dynamic.h"
#include "static.h"
void UseDynamic() {
DynamicFunction();
}
dynamic.h
#pragma once
extern "C" __declspec(dllexport) void DynamicFunction();
dynamic.cpp
#include "dynamic.h"
void DynamicFunction() {}
我知道错误源于 UseDynamic
假设函数也是静态定义的,但我不知道有什么方法可以让它知道函数是否是静态的或者在不知道如何使用另一个库的情况下动态,甚至它可能会涉及一些丑陋的预处理器条件。
是否可以做我想做的事情,或者我需要决定是静态库还是动态库(或者至少,不允许混合使用两者)
编辑:我正在使用 Visual Studio 2017
当您在 Visual Studio 中构建 DLL 项目时,它会与 DLL 一起构建静态导入库。该库包含您的 DLL 导出的函数的 shim 定义,这些函数将负责从 DLL 加载它们。将测试可执行文件链接到 DLL 的导入库应该可以正常工作。