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

10
我想在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
#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的Configuration Properties > C/C++ > General > Additional Include Directories中添加了目录C:\Users\me\Desktop\SolutionDir\,但在调用函数print_stuff()时仍然出现经典错误:error LNK2019: unresolved external symbol

有任何想法吗?

3个回答

7

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

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

  1. 在链接器/常规中,您可能需要将第一个项目生成的.lib文件所在的文件夹添加到“附加库目录”中。
  2. 在链接器/输入中,您需要将.lib文件的名称(例如FirstProject.lib或其他名称)添加到“附加依赖项”中。

非常感谢!我完全忘记指定FirstProject应该是一个静态库。现在它可以工作了! - vanna

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选项卡中。

假设第一个项目是 .dll - Chris A.
我了解到OP不知道DLLs的事情。虽然你不能告诉他们所有需要知道的内容,但是提供一个链接或者其它资源可以帮助他们开始学习。 - John Dibling
@ChrisA. 为什么?你不能动态加载一个exe吗? :) - Luchian Grigore
我曾认为 _declspec(dllexport) 只应在从 .dll 导出时使用。如果第一个项目是静态库,它是否也适用? - Chris A.
@ChrisA。我不确定静态库是否需要,但我不认为它不能工作。 - Luchian Grigore
是的,你说得对,在静态库的情况下不会有影响。 - Chris A.

0

你可以为你的包含目录包括一个真实路径! 比如对于你的FirstProject,包含"./../" 对于你的第二个项目,同样的包含目录,这样你就可以移动或复制你的目录SolutionDir,它总是有效的!

对于你未解决的链接,你必须在你的First和Second Project中添加function.cpp和function.h函数。 你可以把它放在SolutionDir中! 这样你就总是有两个文件来处理你的第一个和第二个项目,而不是四个!

希望能帮到你!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接