10

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

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

函数.h

#pragma once
void print_stuff();

函数.cpp

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

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

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

主文件

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

int main(void) {
    print_stuff();

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

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

有任何想法吗 ?

4

3 回答 3

7

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

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

  1. 在链接器/常规中,您可能需要将.lib构建第一个项目的文件夹添加到“其他库目录”。
  2. 在链接器/输入中,您需要将文件名添加到附加依赖项中,例如.lib文件FirstProject.lib名或任何文件名。
于 2012-05-03T20:28:46.633 回答
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实现功能的项目生成的文件添加到Extra dependencies项目配置的 Liner 设置中的选项卡中。

于 2012-05-03T20:27:33.393 回答
0

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

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

希望能帮助到你 !

于 2012-05-03T20:31:10.133 回答