标签: dllexport

Visual C++下dllimport/dllexport及静态库编译

我迫切需要你的帮助。

我尝试使用 Visual C++ 2008 编译器在 Windows 上静态编译 poppler 库(特别是 qt4)。为了完成这个任务,我还需要静态编译一堆其他库作为 poppler 的依赖项。当我最终生成 poppler 的静态版本时,我在构建应用程序时遇到链接错误:

error LNK2019: unresolved external symbol "__declspec(dllimport)...
Run Code Online (Sandbox Code Playgroud)

我已经添加了新的包含路径并链接了 poppler-qt4.lib 但我仍然收到错误。寻找解决方案我在 stackoverflow 中找到了这个讨论

如何在 Visual C++ 2008 中链接静态库?

根据这些信息,我查看了库的包含文件(poppler 的依赖项,如 zlib、libpng、cairo 等),我发现在各种情况下,它们没有预处理器指令来指定静态版本图书馆。静态指令示例(openjpeg.h):

#if defined(OPJ_STATIC) || !(defined(_WIN32) || defined(WIN32) || defined(__WIN32__))
# define OPJ_API
# define OPJ_CALLCONV
#else
# define OPJ_CALLCONV __stdcall
# ifdef OPJ_EXPORTS
#  define OPJ_API __declspec(dllexport)
# else
#  define OPJ_API __declspec(dllimport)
# endif /* OPJ_EXPORTS */
#endif /* !OPJ_STATIC || !WIN32 */
Run Code Online (Sandbox Code Playgroud)

没有静态指令的示例(jpeg lib …

static poppler dllimport dllexport visual-c++-2008

5
推荐指数
2
解决办法
1万
查看次数

使用dllexport时出错?

我想使用 dllexport 导出函数。但是我在编译器“错误 C4439:'WrappedC':签名中具有托管类型的函数定义必须具有 __clrcall 调用约定”时遇到了错误。

我在头文件(.h)中的代码是:

extern "C" 
{

__declspec(dllexport) int __stdcall ABC(int i);
__declspec(dllexport) char* __stdcall C(int i);
__declspec(dllexport) array<char>^ __stdcall WrappedC(int i) ;

}
Run Code Online (Sandbox Code Playgroud)

我尝试将 _stdcall 更改为 __clrcall 但又出现另一个错误:

error C3395: 'WrappedC' : __declspec(dllexport) cannot be applied to a function with the __clrcall calling convention
Run Code Online (Sandbox Code Playgroud)

我在网上搜索过,但还没有解决。

谢谢,

大统华集团

.net c++ managed-c++ dllexport

5
推荐指数
1
解决办法
5731
查看次数

禁止创建导入库 - Visual C++ 链接器

尽管源代码中有 (dllexport) 指令,是否有一种可能未记录的方法来阻止链接器创建IMPLIBDLL 或 EXE ?__declspec

不指定/IMPLIB会导致.LIB使用默认名称创建。

当 declspec 指令来自不受控制的第 3 方代码时,这一点很重要。例如,就是这种情况boost::serialization。一种可能的解决方案是“取消声明”DLL 导出。DEF 文件也无法做到这一点(AFAIK),因为它只能添加到导出列表中,而不能从其中删除。

c++ dll dllexport visual-c++ import-libraries

5
推荐指数
1
解决办法
3065
查看次数

在 linux 上将共享库与未解析的符号链接起来

我有以下三个项目:

  • Host:导出全局变量的可执行文件(声明为 extern)
  • Plugin:由Host全局变量加载并引用的运行时库
  • Tool:一个可执行文件,链接到它Plugin并使用它的某些功能。它不以任何方式引用全局变量。

现在,如果我在 Windows 上构建它,一切都很好。该Tool只链接到的出口库Plugin并不会尝试解决全局变量。

在 linux 上,我遇到了问题。在Tool尝试对链接Plugin.so库(因为没有导出库),并会发现参考全局变量Host,它解决不了。

如何解决这个问题呢?


编辑:

以下是使用 CMake 的问题的可编译示例。

CMakeLists.txt

SET(CMAKE_RUNTIME_OUTPUT_DIRECTORY_DEBUG "${CMAKE_CURRENT_SOURCE_DIR}/bin")
SET(CMAKE_LIBRARY_OUTPUT_DIRECTORY_DEBUG "${CMAKE_CURRENT_SOURCE_DIR}/bin")

SET(CMAKE_POSITION_INDEPENDENT_CODE ON)

ADD_SUBDIRECTORY(Host)
ADD_SUBDIRECTORY(Plugin)
ADD_SUBDIRECTORY(Tool)
Run Code Online (Sandbox Code Playgroud)

主机/主机.h

#ifndef HOST_H
#define HOST_H

#ifdef _MSC_VER

#ifdef COMPILE_HOST
#define HOST_EXPORT __declspec(dllexport)
#else
#define HOST_EXPORT __declspec(dllimport)
#endif

#else
#define HOST_EXPORT
#endif


class HOST_EXPORT Host
{
public:
    int getAnswer();

};


extern HOST_EXPORT Host g_host;


#endif
Run Code Online (Sandbox Code Playgroud)

主机/主机.cpp

#include "Host.h" …
Run Code Online (Sandbox Code Playgroud)

c++ linux cmake shared-libraries dllexport

5
推荐指数
1
解决办法
1310
查看次数

GCC:如何导出(选定的方法和)类的 vtable / typeinfo 而不导出整个类?

我在共享库中有这个类:

class Interface {
    int m_ref;
public:
    FOO_EXPORT virtual ~Interface();
    virtual void foo() = 0;

protected:
    void ref() { ++m_ref; }
    bool deref() { return --m_ref; }
};

// cpp file:
Interface::~Interface() {}
Run Code Online (Sandbox Code Playgroud)

哪里FOO_EXPORT__attribute__((visibility=default))GCC 的,我正在使用-fvisibiliy=hidden -fvisibility-inlines-hidden.

但是当我使用Interface另一个库中的 时,我得到了 typeinfo 和 vtable 的未定义引用。

在 MSVC 上,其中FOO_EXPORT) declspec(dllexport/dllimport` 工作正常,因为导出虚拟函数时会导出 vtable。

我当然可以导出整个班级:

类 FOO_EXPORT 接口 {

但这也导出所有内联方法。

是否有一个中间立场,仅导出~Interface()vtable,而没有其他内容?

如果您知道:为什么 GCC 与 MSVC 不兼容?

c++ gcc dllexport

5
推荐指数
0
解决办法
1365
查看次数

带有嵌套类的 dllexport

在我正在处理的 DLL 中,我想导出以下类:

class A {

public:
    class B
    {
        std:string placeholder;
    };

    boost::shared_ptr<B> sp;
};
Run Code Online (Sandbox Code Playgroud)

与该代码我需要DLLEXPORT AA::Bboost::shared_ptr<A::B>boost::shared_ptr<A::B>在声明之前A::sp,我无法 dllexport (我必须在命名空间级别执行此操作),因为class A::B尚不清楚。像这样声明:

class A::B;
Run Code Online (Sandbox Code Playgroud)

不起作用。像这样声明:

class B;
Run Code Online (Sandbox Code Playgroud)

实际上声明了另一个类。我该如何解决?

c++ dllexport

5
推荐指数
0
解决办法
780
查看次数

C# 非托管导出不起作用

我正在尝试使非托管导出基本示例正常工作。

我正在执行的步骤:

  • 创建一个新的类库项目。
  • 使用 nuget 添加 UnmanagedExports。
  • 将 CPU 目标更改为 x86。
  • 将我正在关注的教程中的代码添加到 .cs 文件中。
  • 建造

该项目已成功构建,但是当我使用DLL Export Viewer检查我的 dll 时,我看不到任何函数。

我使用的是 32 位操作系统和 SharpDevelop 4.4(我也尝试过其他 SharpDevelop 版本和 64 位操作系统,结果相同)。

我的 sln 文件:

Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "test", "test\test.csproj", "{AFAA816C-65B2-4B58-9FB2-EB7482AA0F5F}"
    EndProject
    Global
        GlobalSection(SolutionConfigurationPlatforms) = preSolution
            Debug|x86 = Debug|x86
            Release|x86 = Release|x86
        EndGlobalSection
        GlobalSection(ProjectConfigurationPlatforms) = postSolution
            {AFAA816C-65B2-4B58-9FB2-EB7482AA0F5F}.Debug|x86.ActiveCfg = Debug|x86
            {AFAA816C-65B2-4B58-9FB2-EB7482AA0F5F}.Debug|x86.Build.0 = Debug|x86
            {AFAA816C-65B2-4B58-9FB2-EB7482AA0F5F}.Release|x86.ActiveCfg = Release|x86
            {AFAA816C-65B2-4B58-9FB2-EB7482AA0F5F}.Release|x86.Build.0 = Release|x86
        EndGlobalSection
    EndGlobal
Run Code Online (Sandbox Code Playgroud)

我的 csproj 文件:

<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" DefaultTargets="Build"> …
Run Code Online (Sandbox Code Playgroud)

.net c# dll dllexport unmanagedexports

5
推荐指数
1
解决办法
3050
查看次数

DLL 注入记事本

我想让一个消息框出现在记事本中,所以我找到了一个简单的dll注入示例。注入器本身不是我的,似乎工作正常(获取进程的 id ,创建一个远程线程,获取 dll 文件的绝对路径)。我认为,问题在于dll. 这些项目在没有任何警告的情况下编译,但没有达到预期的结果。你能看一下并帮助我理解问题吗?(我已经把发行版dll放在了注入器项目文件夹中)

dllmain.cpp:

// dllmain.cpp : Defines the entry point for the DLL application.
#include "stdafx.h"

#include "dll.h"
#include <windows.h>

#include <stdio.h>
#include <stdlib.h>

DLLEXPORT void mess() {
    MessageBoxA(NULL, "HELLO THERE", "From Notepad", NULL);
}
BOOL APIENTRY DllMain( HMODULE hModule,
                       DWORD  ul_reason_for_call,
                       LPVOID lpReserved
                     )
{
    switch (ul_reason_for_call)
{
    case DLL_PROCESS_ATTACH: mess(); break;
    case DLL_THREAD_ATTACH: mess(); break;
    case DLL_THREAD_DETACH: mess(); break;
    case DLL_PROCESS_DETACH: mess(); break;
}
return TRUE;
}
Run Code Online (Sandbox Code Playgroud)

dll.h: …

c++ dll code-injection dllexport

5
推荐指数
1
解决办法
4693
查看次数

从不带 extern "C" 的 dll 导出 C++ 函数

目标:应用程序应该能够使用 LoadLibrary 动态加载 dll,并使用 GetProcAddress 调用其导出函数。

我的 dll 类有一个返回该类类型的 unique_ptr 的函数。

我想导出这个函数,以便应用程序可以在成功加载dll后使用getProcAddress调用这个函数。

使用 extern "C" 将不允许在函数签名中使用 C++ 类(在本例中为 unique_ptr 类模板)。

我知道,如果不使用 extern "C",它将使用损坏的名称导出函数(通过 __declspec(dllexport) )。

客户端在调用 getProcAddress 期间不会知道损坏的名称,那么客户端将如何调用此函数呢?

有没有办法导出这样的功能?

c++ dllexport

5
推荐指数
1
解决办法
1754
查看次数

在 Java Android 项目中使用 C# Dll

我想在由 Java(不是 Xamarin 或 Mono)开发的 Android 项目中使用 C# DLL。我解决此问题的第一个策略包含以下步骤:

  1. 通过 DllExport 从 C# 代码创建 C++ 可用的 DLL。(为 C# 代码创建 C++ 包装器)
  2. 从使用上一步生成的 DLL 的 C++ 项目创建一个 .so 库。

所以我使用了DLLExport(https://github.com/3F/DllExport

C# 方面:

namespace NumbersLibCS
{
    public class Math
    {
        public Math()
        {

        }


        [DllExport]
        public static int GetRandomEvenNumber()
        {
            var rnd = new Random();
            int n = rnd.Next(1, 1000 ) * 2;
            return n;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

但在 C++ 中使用生成的 DLL 我认为我应该只使用 Android 操作系统上不可用的 windows.h 库:

#include <windows.h>

typedef …
Run Code Online (Sandbox Code Playgroud)

c# c++ android dllexport .net-core

5
推荐指数
0
解决办法
826
查看次数