微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何在Scons中使SConscript知道标头位置?

如何解决如何在Scons中使SConscript知道标头位置?

我正在尝试基于Godot向游戏项目添加模块。我希望使用doctest添加单元测试。为简单起见,我将使用link above中给出的示例。因此,我创建了一个简单的文件结构:

summator/
    include/
        summator.h
    src/ 
        summator.cpp
    tests/
        doctest.h
        summator_tests.cpp
        SCsub
    config.py
    register_types.h
    register_types.cpp
    SConstruct/SCsub

Godot需要最后四个文件。这是SConstruct / SCsub(Godot需要第二个文件名,我使用了SConstruct文件进行隔离测试):

#!/usr/bin/env python

# import the environment provided by Godot
Import( 'env' )
# when tested in isolation,replace with following line
# env = Environment()

# add include directory to the search path 
env.Append( CPPPATH = [ '#include' ] ) # relative path

# add all cpp files so Scons can build the module
env.add_source_files( env.modules_sources,'src/*.cpp' )
env.add_source_files( env.modules_sources,'*.cpp' )

# if tests are enabled,build them 
if env[ 'tests' ]:
    sconscript([ 'tests/SCsub' ])

接下来,summator/tests/中的sconscript应该构建测试:

#!/usr/bin/env python

Import( 'env' )

tests_env = env.Clone()

# build tests
tests = test_env.Program( 'runTest',Glob( '*.cpp' )

当我尝试运行此命令时,出现错误消息,提示找不到标题“ summator.h”:

[ 99%] Compiling ==> modules/summator/tests/sumator_tests.cpp
modules/summator/tests/summator_tests.cpp:3:10: Fatal error: 'summator.h' file not found
#include "summator.h"
         ^~~~~~~~~~~~~
1 error generated.
scons: *** [modules/summator/tests/summator_tests.linuxbsd.tools.64.llvm.o] Error 1
scons: building terminated because of errors.

我理解scons环境的方式是,一旦我向其中添加了路径/文件,所有(导入环境)的sconscript都可以访问它。我究竟做错了什么?感觉应该是微不足道的,但是由于某种原因它是行不通的。

以下是完整性的其他源文件

// summator.h
#ifndef SUMMATOR_H
#define SUMMATOR_H

#include "core/reference.h"

class Summator : public Reference 
{
    GDCLASS( Summator,Reference );

    int count;

protected:
    static void _bind_methods();

public:
    void add( int p_value );
    void reset(); 
    int get_total() const;

    Summator();
};

#endif // SUMMATOR_H
// summator.cpp
#include "summator.h"

void Summator::add( int p_value )
{
    count += p_value;
}

void Summator::reset()
{
    count = 0;
}

int Summator::get_total() const 
{
    return count;
}

void Summator::_bind_methods()
{
    ClassDB::bind_method( D_METHOD( "add","value" ),&Summator::add );
    ClassDB::bind_method( D_METHOD( "reset" ),&Summator::reset );
    ClassDB::bind_method( D_METHOD( "get_total" ),&Summator::get_total );
}

Summator::Summator()
{
    count = 0;
}
// summator_tests.cpp
#define DOCTEST_CONfig_IMPLEMENT_WITH_MAIN
// #include "thirdparty/doctest/doctest.h"
#include "summator.h"
#include "doctest.h"

TEST_CASE( "testing the summator" )
{
    // class under test
    Summator* cut = new Summator();

    cut->add(10);
    CHECK( cut->get_total() == 10 )
    cut->add(10);
    CHECK( cut->get_total() == 20 )
    cut->add(10);
    CHECK( cut->get_total() == 30 )
    cut->reset();
    CHECK( cut->get_total() == 0 )

    // clean up 
    delete cut;
}

解决方法

经过一些试验,我找到了一个可行的解决方案,请在Github repository中查看完整的代码。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。