ns3 配置

网络仿真器配置 Ubuntu × CLion

安装

以下环境为 Ubuntu22.04 LTS,安装版本 ns3.39,部分参照文档

首先保证基础包安装

在 3.36 后,至少要安装以下包:g++、python3、cmake、git、ninja

再下载包并解压

wget http://www.nsnam.org/release/ns-allinone-3.30.tar.bz2
tar xjf ns-allinone-3.30.tar.bz2

编译

进入 ns-3.39 运行以检查依赖

./ns3 configure

检查缺少项,如需要,问 GPT 继续安装依赖。然后回到上层

./build.py

测试

复制 examples/tutorial/first.ccscratch,运行

./ns3 run scratch/first

编译速度过慢,启用 ccache

./ns3 configure -- -D CMAKE_C_COMPILER_LAUNCHER=ccache -D CMAKE_CXX_COMPILER_LAUNCHER=ccache

./ns3 实质是 Python 脚本,拿来打包生成 CMake 的工具

新建项目/文件

ns3.36 及以后仅推荐使用 CLion(VSCode 使用 CMake 管理项目同理,但不推荐)

在根目录 CMakeLists.txt 添加后头文件目录后,支持最基本的代码高亮功能

include_directories(build/include)

scratch 目录下

scratch 目录比较特殊,是专门设计来进行测试的,CMake 会扫描该目录以生成目标

  1. scratch 中新建 xxx.cc
  2. 重新载入 CMake 项目,此时会惊奇的发现目标中有 scratch_xxx,即刚刚新建文件的目标

其他目录项目

可以偷个懒,复制 scratch 目录并作修改

  1. 新建目录 xxxx,并复制 scratch/CMakeLists.txt 到新目录下
  2. 查找 scratch 并替换为 xxxx
  3. 在根目录下的 CMakeLists.txt 的添加
add_subdirectory(xxxx)
  1. 重新载入 CMake 项目

补充

补充了一些工具和其他版本构建方法

预编译头

随着编译包含的头文件越来越多,编译速度越来越慢,可以用预编译头来加速。但 ns 构建是一个很大的工程,并不能直接添加

目标生成是在子目录的 CMakeLists.txt 中实现的,但也是通过调用其他函数实现的

function(create_eyderoe source_files)
	...
	build_exec(
            EXECNAME ${eyderoe_name}
            EXECNAME_PREFIX ${target_prefix}
            SOURCE_FILES "${source_files}"
            LIBRARIES_TO_LINK "${ns3-libs}" "${ns3-contrib-libs}"
            EXECUTABLE_DIRECTORY_PATH ${eyderoe_directory}/
    )
endfunction()

build_exec 又是在 build-support/macros-and-definitions.cmake 下进行的定义,有启用变量 PRECOMPILE_HEADERS_ENABLED 和目标 stdlib_pch_exec

function(build_exec)
  ...
  if(${PRECOMPILE_HEADERS_ENABLED} AND (NOT ${BEXEC_IGNORE_PCH}))
    target_precompile_headers(
      ${BEXEC_EXECNAME_PREFIX}${BEXEC_EXECNAME} REUSE_FROM stdlib_pch_exec
    )
  endif()
  ...
endfunction(build_exec)

查找定义 stdlib_pch_exec,发现在同一个 cmake 文件中

if(${PRECOMPILE_HEADERS_ENABLED})
    ...
    set(precompiled_header_libraries
        <algorithm>
        ...
    )
    add_library(
      stdlib_pch${build_profile_suffix} OBJECT
      ${PROJECT_SOURCE_DIR}/build-support/empty.cc
    )
    target_precompile_headers(
      stdlib_pch${build_profile_suffix} PUBLIC
      "${precompiled_header_libraries}"
    )
    add_library(stdlib_pch ALIAS stdlib_pch${build_profile_suffix})

    add_executable(
      stdlib_pch_exec ${PROJECT_SOURCE_DIR}/build-support/empty-main.cc
    )
    target_precompile_headers(
      stdlib_pch_exec PUBLIC "${precompiled_header_libraries}"
    )
    set_runtime_outputdirectory(stdlib_pch_exec ${CMAKE_BINARY_DIR}/ "")
  endif()

由于看不懂,还是仿造此抄一个

ns3.36 前构建补充

从 3.36 开始,ns3 将构建工具 waf,换成了 cmake,但还有一些库停留在过去。这节仅补充 scratch 下代码运行配置

CLion

写代码时使用新建项目时自动配置的 CMake。运行时需在设置中添加外部工具以运行代码,配置如下

  • 程序:ns3 位置,/home/eyderoe/ns3Folder/ns-3-dev-25e0d01d/waf
  • 实参:“–run” $FileRelativePath$
  • 工作目录:选择程序后应该会自动补全

右键 - 外部工具 以运行程序

VSCode

不是很喜欢,但 waf 构建和 CLion 差不多,所以还是记一下。对 .vscode 下文件进行修改手动管理,不使用 CMake 继续管理

c_cpp_properties.json 仅影响代码编写体验

{
    "configurations": [
        {
            "name": "Linux",
            "includePath": [
                "${workspaceFolder}/**",
                "/home/eyderoe/ns3Folder/ns-3-dev-25e0d01d/build"
            ],
            "defines": [],
            "compilerPath": "/usr/bin/gcc",
            "cStandard": "c17",
            "cppStandard": "gnu++17",
            "intelliSenseMode": "linux-gcc-x64"
        }
    ],
    "version": 4
}

launch.json 用于调试代码

{
    "configurations": [
        {
            "name": "C/C++: gcc 生成和调试活动文件",
            "type": "cppdbg",
            "request": "launch",
            "program": "/home/eyderoe/ns3Folder/ns-3-dev-25e0d01d/build/scratch/${fileBasenameNoExtension}",
            "args": [],
            "stopAtEntry": false,
            "cwd": "${fileDirname}",
            "environment": [
                {
                    "name": "LD_LIBRARY_PATH",
                    "value": "/home/eyderoe/ns3Folder/ns-3-dev-25e0d01d/build/lib:${env:LD_LIBRARY_PATH}"
                }
            ],
            "externalConsole": false,
            "MIMode": "gdb",
            "setupCommands": [
                {
                    "description": "为 gdb 启用整齐打印",
                    "text": "-enable-pretty-printing",
                    "ignoreFailures": true
                },
                {
                    "description": "将反汇编风格设置为 Intel",
                    "text": "-gdb-set disassembly-flavor intel",
                    "ignoreFailures": true
                }
            ],
            "preLaunchTask": "C/C++: gcc 生成活动文件",
            "miDebuggerPath": "/usr/bin/gdb"
        }
    ],
    "version": "2.0.0"
}

tasks.json 定义和运行项目相关任务

{
	"version": "2.0.0",
	"tasks": [
		{
			"type": "cppbuild",
			"label": "C/C++: gcc 生成活动文件",
			"command": "./waf",
			"args": [
                "--run",
                "$FileRelativePath$"
				//"-fdiagnostics-color=always",
				//"-g",
				//"${file}",
				//"-o",
				//"${fileDirname}/${fileBasenameNoExtension}"
			],
			"options": {
				"cwd": "${workspaceFolder}"
			},
			"problemMatcher": [
				"$gcc"
			],
			"group": {
				"kind": "build",
				"isDefault": true
			},
			"detail": "编译器: /usr/bin/gcc"
		}
	]
}

ns3.40 后构建补充

ns3.40 后又放弃了 build.py,最开始就不用运行 build.py 了

Logo

码道开发者社区,聚焦华为云码道 CodeArts 代码智能体,沉淀 Agent、Skill、鸿蒙开发实战内容,供开发者查阅资料、交流技术、分享工程实践

更多推荐