【问题标题】:How to use functions from different C++ projects in Visual Studio 2010?如何在 Visual Studio 2010 中使用来自不同 C++ 项目的函数?
【发布时间】:2012-05-13 09:42:15
【问题描述】:

我想在 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

函数.h

#pragma once
void print_stuff();

函数.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 &gt; C/C++ &gt; General &gt; Additional Include Directories 中添加了目录 C:\Users\me\Desktop\SolutionDir\。我仍然得到经典错误:error LNK2019: unresolved external symbol 调用函数 print_stuff() 时。

有什么想法吗?

【问题讨论】:

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


    【解决方案1】:

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

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

    1. 在 Linker/General 中,您可能需要将构建第一个项目的 .lib 的文件夹添加到“其他库目录”中。
    2. 在 Linker/Input 中,您需要将 .lib 文件的名称(如 FirstProject.lib 或其他名称)添加到 Additional Dependencies。

    【讨论】:

    • 非常感谢!我完全忘记指定 FirstProject 应该是一个静态库。它现在正在工作!
    【解决方案2】:

    是的,您需要使用_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选项卡中。

    【讨论】:

    • 这是假设第一个项目是.dll
    • 我收集到 OP 不了解 DLL。你无法告诉他们他们需要知道的一切,但一个链接或其他东西可能会让他们上路。
    • @ChrisA。为什么?你不能动态加载一个exe吗? :)
    • 我的印象是,_declspec(dllexport) 只能在从.dll 导出时使用。如果第一个项目是静态库,它也可以工作吗?
    • @ChrisA。如果静态库需要 IDK,但我不明白为什么它不起作用。
    【解决方案3】:

    你可以为你的包含目录包含一个真实路径! 喜欢你的 FirstProject 包括“./../” 和你的第二个项目相同的包含目录,你可以移动或复制你的目录 SolutionDir,它会一直工作!

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

    希望对你有帮助!

    【讨论】:

      猜你喜欢
      • 2012-12-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-31
      • 2011-11-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多