Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Visual c++ MSVC未解析的外部符号链接可执行文件_Visual C++_Linker_Dependencies_Dllexport_Visual Studio 2010 - Fatal编程技术网

Visual c++ MSVC未解析的外部符号链接可执行文件

Visual c++ MSVC未解析的外部符号链接可执行文件,visual-c++,linker,dependencies,dllexport,visual-studio-2010,Visual C++,Linker,Dependencies,Dllexport,Visual Studio 2010,我有两个现有的可执行文件A和T,在同一个解决方案中,它们在我接触它们之前都运行良好。在可执行文件中,是定义类P的头文件,以及静态实例MyP的原型。定义在项目A中编译。在可执行文件T中,我想调用项目A中MyP的成员函数,因此我在类的声明中添加了dllimport/export宏,在标题中添加了MyP(而不是在定义中),并将标题包含在项目T中。dllimport/export宏是标准的,项目A中定义了A_导出,但T中没有定义 #ifdef A_EXPORTS #define A_API __decl

我有两个现有的可执行文件A和T,在同一个解决方案中,它们在我接触它们之前都运行良好。在可执行文件中,是定义类P的头文件,以及静态实例MyP的原型。定义在项目A中编译。在可执行文件T中,我想调用项目A中MyP的成员函数,因此我在类的声明中添加了dllimport/export宏,在标题中添加了MyP(而不是在定义中),并将标题包含在项目T中。dllimport/export宏是标准的,项目A中定义了A_导出,但T中没有定义

#ifdef A_EXPORTS
#define A_API __declspec(dllexport)
#else
#define A_API __declspec(dllimport)
#endif

//various definitions and includes, defining ENUM_RECORDING_TYPE and ERROR
A_API HFILE viosopen(const _TCHAR *path, ENUM_RECORDING_TYPE rt, int flags);
A_API struct P { 
    ERROR B(SHORT phraseNum);
};
A_API extern P MyP;
我在解决方案中添加了项目A作为对项目T的依赖。A仍然可以很好地编译,但是T为函数调用提供了函数中引用的
unresolved external symbol“\uuuu declspec(import)和
unresolved external symbol”\uuu declspec(dllimport)类P MyP“
用于静态对象。我还在输出日志中看到,在它开始链接之后:
创建库Debug/A.lib和对象Debug/A.exp
,这似乎是不祥的,因为它应该链接到现有的可执行文件


我的问题是:我怎样才能告诉MSVC 2010它们在哪里?我认为简单地将A设置为依赖项会让它自动计算出来。我可以链接现有的可执行文件,对吗?

我假设项目A是DLL而不是EXE,它正在成功生成一个LIB文件。
您需要使用
A.LIB
作为项目B中的链接器输入。仅生成LIB文件不会使其他项目自动链接到它。

静态链接您的程序您不需要u declspec()内容,也不需要单独的项目来创建LIB文件。我认为您可以使用A项目中的.obj文件进行链接

您的A项目有一个头文件,可能有一个.cpp文件,其中包含该头文件中描述的项目的实现。假设您的头文件是
foo.h
,关联的实现是
foo.cpp
。编译时,在
\a\Debug
\a\release
中间文件夹中应该有一个
foo.obj
中间文件。链接器可以使用该文件

在项目T的属性中,找到链接器输入并更改“附加依赖项”属性以包括
foo.obj
文件。一种方法是使用相对文件路径来定位文件,例如调试配置中的
。\a\Debug\foo.obj
。另一种方法是在“附加依赖项”中使用简单的文件名--
foo.obj
,然后使用链接器|常规|附加库目录”帮助链接器查找文件-例如,
。\A\$(IntDir)
。使用
$(IntDir)
宏的优点是相同的值适用于调试和发布设置

请记住设置从T项目到a项目的生成依赖项,以确保首先编译a项目。否则,当T链接器来查找
foo.obj
文件时,该文件可能不存在。在解决方案属性中,选择项目依赖项,然后设置项目T依赖于项目a

要动态链接,您需要使用@ajay所说的
A.LIB
文件。
\uuuu declspec(DllImport)
告诉编译器您要导入哪些函数和数据,但不告诉编译器这些东西是从何处导入的

使用
A.LIB
文件作为链接器的输入与在静态链接情况下使用
foo.obj
文件基本相同,只是LIB文件最终位于解决方案输出目录
\Debug
而不是项目中间目录
\A\Debug


这篇关于创建和使用DLL的文章可能是有用的背景。

您需要在项目a中向我们展示您的声明。我怀疑您没有正确地标记类和静态实例(使用API)你是想静态链接到MyP等的实现,还是想动态链接到A.exe?@Frank Boyne:因为exe和dll基本上是相同的文件格式,我想它可以像dll一样链接,所以动态。静态会更好,因为我只需要四个函数,但我不想添加另一个项目来创建一个A.@YeehFei的静态lib版本:我复制了代码(使用重命名的名称).Nope,项目A是一个EXE文件。我从来没有想过要链接到.obj文件,这太棒了!让我们看看我是否能让它工作。刚刚发现A也与其他几个项目静态链接。我将阅读DLL演练。这需要更多的工作,但您可以考虑将所有公共代码移动到第三个项目,该项目将构建一个DLL,该DLL同时具有项目A和项目T链接到。当项目X也希望使用公共代码时,您会很高兴这样做。