如何在Visual Studio 2010中使用来自不同C ++项目的函数?

时间:2012-05-03 20:21:31

标签: c++ visual-studio-2010 include unresolved-external multiple-projects

我想在Visual Studio 2010中的相同解决方案中构建两个可以相互交互的C ++项目。我在目录C:\Users\me\Desktop\SolutionDir下创建了一个解决方案。这两个项目分别在C:\Users\me\Desktop\SolutionDir\FirstProjectC:\Users\me\Desktop\SolutionDir\SecondProject下创建。

我的第一个项目包含两个文件,一个标题function.h和一个cpp文件function.cpp

function.h

#pragma once
void print_stuff();

function.cpp

#include "function.h"
#include <iostream>

void print_stuff() {
    std::cout << "hello world" << std::endl;
}  

我的第二个项目包含主文件main.cpp

的main.cpp

#include "FirstProject\function.h"
#include <iostream>

int main(void) {
    print_stuff();

    int stop;
    std::cin >> stop;
    return 0;
}  

我在SecondProject C:\Users\me\Desktop\SolutionDir\中添加了目录Configuration Properties > C/C++ > General > Additional Include Directories。调用函数error LNK2019: unresolved external symbol时,我仍然会得到经典错误:print_stuff()

有什么想法吗?

3 个答案:

答案 0 :(得分:7)

尝试在项目属性/配置属性/常规/配置类型中将第一个项目构建为静态库。

然后在第二个项目的项目属性中,您需要更改两件事:

  1. 在链接器/常规中,您可能需要添加到&#34;其他库目录&#34;构建第一个项目.lib的文件夹。
  2. 在链接器/输入中,您需要将.lib文件的名称添加到附加依赖项,例如FirstProject.lib或其名称。

答案 1 :(得分:3)

是的,您需要使用_declspec(dllexport)导出函数,并将其导入到使用_declspec(dllimport)调用函数的项目中。

这种二元性通常用宏来实现:

#pragma once

#ifdef FIRST_PROJECT_BUILD
#define IMPEXP _declspec(dllexport)
#else
#define IMPEXP _declspec(dllimport)
#endif

IMPEXP void print_stuff();

在第一个项目的配置中,将FIRST_PROJECT_BUILD添加到预处理程序指令中。这样,当您编译第一个项目时,您告诉编译器要导出该函数。但是,当您将文件包含在未定义FIRST_PROJECT_BUILD的其他项目中时,您告诉编译器该函数是在不同的库中实现的,应该导入。

此外,除了添加额外的包含路径之外,还需要将实现这些功能的项目中生成的.lib文件添加到项目配置的Liner设置中的Extra dependencies选项卡中。

答案 2 :(得分:0)

您可以为包含目录包含realPath! 与您的FirstProject一样,包括“./../” 同样包括你的第二个项目的目录,就像你可以移动或复制你的目录SolutionDir,它将永远有效!

对于未解析的链接,您必须在第一个和第二个项目中添加function.cpp和function.h 你可以把它放在SolutionDir中! 就像那样你的第一个和第二个项目总共有两个文件,而不是四个!

希望它有所帮助!