我想在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
#pragma once
void print_stuff();
#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;
}
我在SecondProject C:\Users\me\Desktop\SolutionDir\
中添加了目录Configuration Properties > C/C++ > General > Additional Include Directories
。调用函数error LNK2019: unresolved external symbol
时,我仍然会得到经典错误:print_stuff()
。
有什么想法吗?
答案 0 :(得分:7)
尝试在项目属性/配置属性/常规/配置类型中将第一个项目构建为静态库。
然后在第二个项目的项目属性中,您需要更改两件事:
.lib
的文件夹。.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中! 就像那样你的第一个和第二个项目总共有两个文件,而不是四个!
希望它有所帮助!