Visual c++ MSVC未解析的外部符号链接可执行文件
我有两个现有的可执行文件A和T,在同一个解决方案中,它们在我接触它们之前都运行良好。在可执行文件中,是定义类P的头文件,以及静态实例MyP的原型。定义在项目A中编译。在可执行文件T中,我想调用项目A中MyP的成员函数,因此我在类的声明中添加了dllimport/export宏,在标题中添加了MyP(而不是在定义中),并将标题包含在项目T中。dllimport/export宏是标准的,项目A中定义了A_导出,但T中没有定义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
#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也希望使用公共代码时,您会很高兴这样做。