C++ C++;-解决使用静态和动态库时的链接器错误

C++ C++;-解决使用静态和动态库时的链接器错误,c++,dll,static-libraries,static-linking,dynamic-linking,C++,Dll,Static Libraries,Static Linking,Dynamic Linking,我正在寻找一组开发人员可以使用的库,他们可以决定是将它们用作动态库,还是静态库。当然,这带来了一些复杂性问题,当前的问题是符号分辨率。在我的测试代码中,我有3个项目:可执行项目、静态项目和动态项目。顾名思义,静态项目编译为.lib,动态项目编译为.dll 静态项目包含动态项目代码的标题,并调用函数DynamicFunction,这意味着它将在编译时尝试链接到此函数。但是,动态项目正在编译到一个共享库中,它不可用,并且不链接。在这三个项目中,我有没有办法定义功能来解决这个问题 我的测试代码如下:

我正在寻找一组开发人员可以使用的库,他们可以决定是将它们用作动态库,还是静态库。当然,这带来了一些复杂性问题,当前的问题是符号分辨率。在我的测试代码中,我有3个项目:可执行项目、静态项目和动态项目。顾名思义,静态项目编译为.lib,动态项目编译为.dll

静态项目包含动态项目代码的标题,并调用函数
DynamicFunction
,这意味着它将在编译时尝试链接到此函数。但是,动态项目正在编译到一个共享库中,它不可用,并且不链接。在这三个项目中,我有没有办法定义功能来解决这个问题

我的测试代码如下:

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.cpp

#include "../dynamic/dynamic.h"
#include "static.h"

void UseDynamic() {
    DynamicFunction();
}
动态

#pragma once
extern "C" __declspec(dllexport) void DynamicFunction();
dynamic.cpp

#include "dynamic.h"
void DynamicFunction() {}
我认识到错误源于
UseDynamic
的假设,即函数也是静态定义的,但我不知道有什么方法可以让它知道函数是静态的还是动态的,而不知道另一个库是如何使用的,甚至它也可能涉及一些难看的预处理器条件

可以做我想做的事情,或者我需要决定是静态库还是动态库(或者至少不允许两者混合)


编辑:我正在使用Visual Studio 2017

在Visual Studio中构建DLL项目时,它将与DLL一起构建静态导入库。此库包含DLL导出的函数的垫片定义,这些函数将负责从DLL加载它们。将测试可执行文件链接到DLL的导入库应该可以正常工作。

main.o
链接到可执行文件时,是否确保将
-ldynamic
添加到链接器命令行?创建静态库不会抛出任何未定义的引用,因为它是一个不完整的链接,即生成的
.lib
是不可执行的,并且不包括
.dll
中的代码,即依赖项链是main.exe。我使用Visual Studio,因此我不太熟悉链接器的命令行选项,因此,我不确定
-ldynamic
是否是一个选项,但Visual Studio确实有一个选项可以强制输出文件,即使链接时存在未解析的符号。这就是你所说的行为吗?因为我不确定这将如何导致
UseDynamic
函数知道如何使用dll中的函数。不,这样做是错误的。它将创建一个中断的可执行文件,而不依赖于动态库。我不确定是否可以在VS GUI中定义所需的依赖项。我想你需要写一个项目文件。如果我的内存没有问题,那么您可以在VS中打开
.prj
.proj
文件来创建工作区。IIRC DLL项目通常会与处理此问题的DLL一起构建一个静态导入库。将您的测试可执行文件链接到该文件,它应该会工作。@MilesBudnek,它似乎正在工作!你能把它写下来作为答案,这样我就可以把它标记为正确的吗?
#include "dynamic.h"
void DynamicFunction() {}