[问题] 非常基本的建立DLL的问题

楼主: zzzoprah (重新认识自己)   2019-11-26 06:50:01
开发平台(Platform): (Ex: Win10, Linux, ...)
Win10
编译器(Ex: GCC, clang, VC++...)+目标环境(跟开发平台不同的话需列出)
VS2019
额外使用到的函数库(Library Used): (Ex: OpenGL, ...)
问题(Question):
本身对 C++ 只有稍微看得懂, Google 后大致可以理解程式码的程度
现在需要用已存在的 C file 来建立一组 DLL 让其他程式使用
在 Build 的时候 出现 LNK2019 unresolved external symbol 的错误
请问该怎么解决呢?
我用 VS2019 开了 DLL 的solution 并建立了一个 dllmaim.cpp
dllmain.cpp 里面 include "proatmapi.h"
同时把 proatmapi.c 与 proatmapi.h 都放到同路径下
在建立 DLL 时即使我 include proatmapi.h 但没有使用相关函式
就不会出现错误
但只要有用到 proatmapi 里的函式就会给我 LNK2019 的错误
我猜测的原因/解决方法:
1. 我需要把 proatmapi.c 变成 .lib 才能被 dllmain.cpp 使用?
2. proatmapi 是 ".c" 不是 ".cpp", 不能混用?
很抱歉来问如此基本的问题
也很感谢大家给予的指导!!
程式码(Code):(请善用置底文网页, 记得排版,禁止使用图档)
以下是 dllmain.cpp的内容
真的很单纯没有什么
当我 disable *value = proatmInitAdapters(); 那一行
就可以成功建立 DLL
// dllmain.cpp : Defines the entry point for the DLL application.
#include "pch.h"
#include <winsock2.h>
#include <windows.h>
//#include <ansi_c.h> // For LabWindows environment
#include <stdio.h>
#include "proatmapi.h"
BOOL APIENTRY DllMain(HMODULE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
case DLL_PROCESS_DETACH:
break;
}
return TRUE;
}
//Function declarations
extern "C" __declspec(dllexport) int __cdecl InitATMAdapter(int* value);
__declspec(dllexport) int InitATMAdapter(int* value)
{
*value = proatmInitAdapters();
return -25;
}
补充说明(Supplement):
作者: Schottky (顺风相送)   2019-11-26 07:12:00
听起来你没有编译 proatmapi.c, 专案设定一下吧正常来说只要把这个档案加入专案即可 (.h 也要加入)
楼主: zzzoprah (重新认识自己)   2019-11-27 12:17:00
谢谢! 照您所说的把 proatmapi.c 加到专案后就没有这个错误了。但是他给我新的错误说proatmapi.c不是.cpp所以我直接(很傻的)把副档名改成cpp,没有太多抱怨只有说BOOL (PATM_ADAPTER,DWORD*) cannot convertargument 2 from 'int*' to 'DWORD'发生在 proatmapi.h 中这一行:proatmEntry[i].GetATMAdapters(proatmAdapterList,&AdapterCount);在 proatmapi.h 中:typedef struct _TYPE_ENTRY{BOOL (*GetATMAdapters)( PATM_ADAPTER, DWORD *);BOOL (*GetATMInformation) ( PATM_ADAPTER);BOOL (*CreateATMPVC)( PATM_PVC);BOOL (*DeleteATMPVC)( PATM_PVC);int (*WriteATMPVC)(PATM_PVC, char *, int);} TYPE_ENTRY, *PTYPE_ENTRY;请问我该怎么修改,或是正确的让.c可以与.cpp合用?
作者: Schottky (顺风相送)   2019-11-27 15:01:00
原则上是 .h 中加 extern "C" { ..... } 就可以了DWORD 和 DWORD* 差很多,中间是不是有什么误会?如果还有问题的话可以剪贴完整的错误讯息大家来参详直接改名成.cpp大多数时候也没问题,该错误应该与此无关

Links booklink

Contact Us: admin [ a t ] ucptt.com