ns3 配置 Ubuntu × CLion
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.cc 到 scratch,运行
./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 会扫描该目录以生成目标
- 在
scratch中新建xxx.cc - 重新载入 CMake 项目,此时会惊奇的发现目标中有
scratch_xxx,即刚刚新建文件的目标
其他目录项目
可以偷个懒,复制 scratch 目录并作修改
- 新建目录
xxxx,并复制scratch/CMakeLists.txt到新目录下 - 查找 scratch 并替换为 xxxx
- 在根目录下的
CMakeLists.txt的添加
add_subdirectory(xxxx)
- 重新载入 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 了
更多推荐


所有评论(0)