我迫切需要你的帮助。
我尝试使用 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 中找到了这个讨论
根据这些信息,我查看了库的包含文件(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 …
我想使用 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)
我在网上搜索过,但还没有解决。
谢谢,
大统华集团
尽管源代码中有 (dllexport) 指令,是否有一种可能未记录的方法来阻止链接器创建IMPLIB
DLL 或 EXE ?__declspec
不指定/IMPLIB
会导致.LIB
使用默认名称创建。
当 declspec 指令来自不受控制的第 3 方代码时,这一点很重要。例如,就是这种情况boost::serialization
。一种可能的解决方案是“取消声明”DLL 导出。DEF 文件也无法做到这一点(AFAIK),因为它只能添加到导出列表中,而不能从其中删除。
我有以下三个项目:
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) 我在共享库中有这个类:
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 不兼容?
在我正在处理的 DLL 中,我想导出以下类:
class A {
public:
class B
{
std:string placeholder;
};
boost::shared_ptr<B> sp;
};
Run Code Online (Sandbox Code Playgroud)
与该代码我需要DLLEXPORT A
,A::B
和boost::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)
实际上声明了另一个类。我该如何解决?
我正在尝试使非托管导出基本示例正常工作。
我正在执行的步骤:
该项目已成功构建,但是当我使用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) 我想让一个消息框出现在记事本中,所以我找到了一个简单的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: …
目标:应用程序应该能够使用 LoadLibrary 动态加载 dll,并使用 GetProcAddress 调用其导出函数。
我的 dll 类有一个返回该类类型的 unique_ptr 的函数。
我想导出这个函数,以便应用程序可以在成功加载dll后使用getProcAddress调用这个函数。
使用 extern "C" 将不允许在函数签名中使用 C++ 类(在本例中为 unique_ptr 类模板)。
我知道,如果不使用 extern "C",它将使用损坏的名称导出函数(通过 __declspec(dllexport) )。
客户端在调用 getProcAddress 期间不会知道损坏的名称,那么客户端将如何调用此函数呢?
有没有办法导出这样的功能?
我想在由 Java(不是 Xamarin 或 Mono)开发的 Android 项目中使用 C# DLL。我解决此问题的第一个策略包含以下步骤:
所以我使用了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)