Создание библиотеки Dynami c с использованием командной строки MSV C - PullRequest
1 голос
/ 18 февраля 2020

Я прочитал много постов, и все же я не понимаю, как создать простую динамическую библиотеку c на windows с использованием MSV C в командной строке. Что я делаю:

1º) Код DLL

Dynami c .h

#pragma once

__declspec(dllexport) void HelloWorld();

Dynami c. c

#include "dynamic.h"
#include <stdio.h>

void HelloWorld(){
    printf("Hello World");
}

2º) Скомпилируйте его

cl /LD dynamic.c

(он компилируется правильно и без ошибок, генерируя Dynami c .dll и Dynami c .lib)

3о) Попробуйте проверить его

1021 * главный. c
#include<stdio.h>
#include"dynamic.h"
int main(){

    HelloWorld();

    return 0;
}
cl main.c dynamic.lib

ERROR (by cl.exe x64)

main.cpp
Microsoft (R) Incremental Linker Version 14.16.27034.0
Copyright (C) Microsoft Corporation.  All rights reserved.

/out:main.exe
main.obj
.\dynamic.lib
main.obj : error LNK2019: unresolved external symbol "void __cdecl HelloWorld(void)" (?HelloWorld@@YAXXZ) referred in main
main.exe : fatal error LNK1120: unresolved externals

Пожалуйста, научите меня, как на самом деле работает компиляция динамических c библиотек, потому что я не понимаю

Ответы [ 2 ]

3 голосов
/ 18 февраля 2020

Попробуйте в динамии c .h:

#ifdef __cplusplus  
extern "C" {
#endif 
    __declspec(dllexport) void HelloWorld();
#ifdef __cplusplus 
}
#endif 


Используйте 'dumpbin.exe / exports dynamici c .dll', чтобы показать экспортированные символы

1 голос
/ 18 февраля 2020

В main.c он должен видеть объявление функции следующим образом:

__declspec(dllimport) void HelloWorld();

Таким образом, вы не можете использовать тот же dynamic.h, который вы используете в настоящее время, как для сборки DLL, так и для сборки main.c ,

Обычно люди используют настройку препроцессора, поэтому один и тот же заголовочный файл имеет различный declspe c в зависимости от того, кто его включает, например:

// dynamic.h
#ifndef DLL_FUNCTION 
#define DLL_FUNCTION __declspec(dllimport)
#endif

DLL_FUNCTION void HelloWorld();

dynamici c. c (в DLL):

#define DLL_FUNCTION __declspec(dllexport)
#include "dynamic.h"
...