9

我目前正在尝试学习如何使用 premake 4 以将其应用于 OpenGL sdk。我目前正在尝试制作一个构建 2 个项目的 Visual Studio 2010 解决方案,一个是静态库,另一个包含一个带有 main 方法的主源文件。

这个项目非常简单,完全是为了学习premake。在名为 Test 的静态库项目中,我有 2 个文件,Test.h 和 Test.cpp。Test.h 包含方法 print() 的原型。print() 只是在控制台打印一行。使用 premake,我将静态库链接到 Main 项目,并在 main.cpp 中包含了 Test.h 文件。我的问题是:在 VS2010 中,当我尝试构建时出现此错误:

1>main.obj:错误 LNK2019:函数 _main 中引用的未解析外部符号“void __cdecl print(void)”(?print@@YAXXZ)  
1>.\Main.exe : 致命错误 LNK1120: 1 unresolved externals

这是我在 4 个文件 premake4.lua 中的代码:

solution "HelloWorld"
    configurations {"Debug", "Release"}
project "Main"
    kind "ConsoleApp"
    language "C++"
    files{
        "main.cpp"

    }
    configuration "Debug"
        defines { "DEBUG" }
        flags { "Symbols" }

    configuration "Release"
        defines { "NDEBUG" }
        flags { "Optimize" } 
    links {"Test"}
project "Test"
    kind "StaticLib"
    language "C++"
    files{
        "test.h",
        "test.cpp"

    }

测试.cpp:

#include <iostream>

void print(){
    std::cout << "HELLO" << std::endl;
}

测试.h:

void print();

主要.cpp:

#include <conio.h>
#include "test.h"
int main(){
    print();
    getch();
    return 0;
}   

如果您想知道为什么那里有一个 getch(),在我的计算机上,控制台一旦达到 return 0 就会立即关闭,所以我使用 getch() 来解决这个问题,这会强制窗口等待用户按下另一个键. 关于这个问题的任何建议都会很棒,因为我根本不确定问题是什么。如果它很简单,请不要阉割我,我对预制和静态库的经验很少,这就是我尝试学习它们的原因。

4

1 回答 1

13
links {"Test"}

Lua 不是 Python。空格与 Lua 无关,就像空格与 C++ 无关一样。所以你的links陈述只适用于"Release"配置。如果你想让它作为一个整体应用到项目中,它需要放在configuration语句之前,就像你的kind,files和其他命令一样。

Premake4 以这种方式工作,因此您可以拥有仅在"Release"构建(或调试或其他)中使用的某些库。实际上,您几乎可以将任何 project命令放在configuration. 因此,您可以拥有仅用于调试构建或其他任何内容的特定文件。

于 2011-11-25T18:14:28.573 回答