c++ - Fuzzylite 与 Castalia Simulator 集成的控制台问题

标签 c++ makefile

我一直在努力将 Fuzzylite 集成到我的模拟器 Castalia 中,到目前为止,在 Fuzzylite src 文件夹下有一个与 Console.cpp 相关的错误。 为了将 Fuzzylite 链接到我的模拟器 Castalia,我在 Castalia 下的 makemake 文件中添加了 EXTOPTS

#!/bin/bash

ROOT=`pwd`

# The following options are used by OMNeT's opp_makemake tool
# For explanation and a complete list of options run: opp_makemake -h
OPTS=" -f -r --deep -o CastaliaBin -u Cmdenv -P $ROOT -M release"

# -X excludes a directory from being considered
EXCLUDEDIRS=" -X Simulations -X out -X bin"

# Use options -I -L -l to include external header files or libraries    

EXTOPTS="-I /home/utar/Desktop/HY/fuzzylite-6.0/fuzzylite/ -L /home/utar/Desktop/HY/fuzzylite-6.0/fuzzylite/release/bin/ -lfuzzylite"



# Run OMNeT's opp_makemake tool with the above options
opp_makemake $OPTS $EXCLUDEDIRS $EXTOPTS

然后在编译顺利运行的同时,模拟根本无法运行。跟踪文件后,我能够跟踪问题的根源,该问题是由用 Python 编写的 Castalia bin 文件引起的。以下是与我有关的代码片段:

r_castalia = re.compile("^Castalia\|\s+(.+)$")
r_scenario = re.compile("Scenario:\s(.*)\$repetition=(\d+)$")
r_progress = re.compile("^\*\* Event \#\d+\s+T=(\S+)\s+Elapsed: (\S+)s.+\s(\d+)\% completed")
r_newrun = re.compile("Preparing for running configuration General, run #(\d+)")
r_totalrun = re.compile("Number of runs: (\d+)")

for ini in iniList:
    ini_num += 1
    baselabel = label = labelList.pop(0) 

    f = open("omnetpp.tmp","w")
    f.write("[General]\n")
    f.write("repeat = " + str(options.repeat) + "\n")
    for k in sorted(ini.keys()):
        f.write(k + " = " + ini[k] + "\n")
    f.close();
    has_output = 0

    print "path to CastaliaBint is : " +  pathToCastaliaBin 

    if sys.version_info > (2,7):
        data = subprocess.check_output([pathToCastaliaBin, '-f', 'omnetpp.tmp', '-x', 'General']).split("\n")

        #data = subprocess.check_output(["/home/utar/Desktop/Castalia/CastaliaBin", '-f', 'omnetpp.tmp', '-x', 'General']).split("\n")

    else:
        data = subprocess.Popen([pathToCastaliaBin, '-f', 'omnetpp.tmp', '-x', 'General'], stdout=subprocess.PIPE).communicate()[0].split("\n")

    if len(data) > 6: data = data[6]
    else: 
        data = ""

    m = r_totalrun.match(data)

    print "r_totalrun is : " + str(r_totalrun) 
    if (m):
        runs = "/" + m.group(1)
    else:
        print "WARNING: unable to determine total simulation runs"
        runs = ""

结果,输出显示如下:

WARNING: unable to determine total simulation runs

重点在这里:

if sys.version_info > (2,7):
    data = subprocess.check_output([pathToCastaliaBin, '-f', 'omnetpp.tmp', '-x', 'General']).split("\n")

经过一段时间的排查,得知变量数据使用打印函数显示如下输出:

data is [‘[option error] option <-f> not recognized’, ‘{at /src/Console.cpp::parse() [line:134]}’, ”, ”]

我开始意识到 CastaliaBin 以某种方式执行了位于 Fuzzylite 的 src 文件下的 Console.cpp !!!

变量 pathToCastaliaBin 实际上是/home/utar/Desktop/Castalia/Cas​​taliaBin 的路径,其中 CastaliaBin 是一个可执行文件。

正常情况下,在Castalia模拟器中没有包含Fuzzylite库,当我在命令行中输入CastaliaBin时,它会显示如下:Before Fuzzylite is included

在我将 Fuzzylite 与 Castalia 链接后,它显示: After Fuzzylite is included

如您所见,CastaliaBin 以某种方式执行了 Fuzzylite 中的代码!!!

所以我希望有人能帮我一把。我将不胜感激。提前致谢!!!

最佳答案

很好地解释了您的问题,并自行调查。

从您获得的输出来看,似乎当您运行 makemake 来构建 Castalia 时,它构建了 fuzzylite 并且 CastaliaBin 基本上运行了 fuzzylite 库的命令行工具。显然这不是你想要的。

确保:

  • 在构建 Castalia 之前,您根据该库的安装说明构建了 fuzzylite。如果成功完成,您应该能够在 fuzzylite 目录(或安装过程放置它的任何其他位置)中找到文件名 libfuzzylite.alibfuzzylite.so

  • 注意此库文件所在的位置(哪个目录),并将此目录与 -L 开关一起使用。也许库不在 release/bin/

  • 找到头文件目录并将其与 -I 开关一起使用。不要包括整个 fuzzylite 目录。看着Fyzzylite's Github repo头目录好像是fuzzylite/fuzzylite/fl/

最后here's general info关于在 C 中编译静态库,这样您可以获得更好的视角。我怀疑 Fuzzylite 的安装过程隐藏了其中的大部分内容,但最好了解一般原则。

关于c++ - Fuzzylite 与 Castalia Simulator 集成的控制台问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50637730/

相关文章:

c++ - 下面几行中 const 的用法是什么,如果我们不使用这些量怎么办?

makefile - 在 Makefile 中显示构建持续时间

c++ - OpenCV - 直接将矩阵乘法结果复制到另一个矩阵的子集

c++ - 在新字符串中将字符串转换为小写

linux - 是否有一个 makefile 选项可以只删除 obj 文件但保持目标不变?

makefile - 从makefile中获取makefile的名称

linux - `make V=99` 没有显示编译命令

依赖于目录下(包括子目录内)所有文件的 Makefile 规则

c++ - 从 char * 到 Handle

c++ - 在类构造函数中使用单独类的对象