Browsed by
Tag: CMakeLists.txt

使用 Zed 编辑、管理 C/C++ 项目的问题

使用 Zed 编辑、管理 C/C++ 项目的问题

自从项目移植到 Linux 系统以来,一直都没有找到一个合适的、类似 source insight工具来进行 C/C++ 开发。我并不在乎调试等功能,这些用 QtCreator 等工具就足够了。特别在乎的是检索、编辑、提示、联想等纯编辑和审阅的功能。江湖中传说的工具都是 vim、nvim等命令行工具,令人望而却步。

最近找到 Zed ,使用了一段时间,基本功能确实能满足开发需求。但是在项目管理上遇到一个问题:zed 基于目录管理工程。这实在是糟糕透了。对小项目而言,所有文件都在一个主目录下(当然可能包含多个、多层子目录等),这种方式很适合 zed。但是对稍大点的项目,文件可能分布在不同的目录下,如下图所示的两个project:

/home/work
|
|__libs
|
|__project1
|
|__project2

project1 和 project2 都会共用 libs 的库和文件。如果将 zed 的根目录设置在 project1,将 libs 目录添加到工程中,zed 即使打开 libs 中的文件,依然找不到对应的头文件或者符号。将根目录设置在更上一层的 work 目录,则将无关的 project2 也引入了工程,文件、符号等更加混乱。

折腾了很久,目前找到一个相对比较合适、合理的解决方式。以 project1 为例,单独建立一个目录(例如/home/zed_project1),然后将libs、project1都作软连接到这个目录里,如下图所示:

/home/zed_project1
|
|__libs (soft link to /home/work/libs)
|
|__project1 (soft link to /home/work/project1)
|
|CMakeLists.txt

以 zed_project1 为根目录,zed 可以搜索、编辑所有相关的项目文件。

但是 zed 和 clangd 在检索软连接文档的处理上有重大差异。 zed 用软连接目录搜索,但传递给 clangd 的是实际物理路径, clangd 自身也是以文件实际物理路径搜索,因此 CMakeLists.txt 中的文件及 include 目录等,必须设置为文件的实际位置(建议采用绝对路径),如下所示:

# /home/zed_project1/CMakeLists.txt
cmake_minimum_required(VERSION 3.10)
project(mssDevCodeIndex)

set(CMAKE_EXPORT_COMPILE_COMMANDS ON)

# 定义各个模块的根路径
set(MY_WORK_PATH "/home/work")
set(MY_APP_PATH  ${MY_WORK_PATH}/project1)
set(MY_LIB_PATH  ${MY_WORK_PATH}/libs)


# 一次性递归收集所有 .c 和 .cpp(不管在哪个子目录)
file(GLOB_RECURSE ALL_SOURCES 
    "libs/*.cpp"
    "project1/core/*.cpp"
)
add_executable(mssdev ${ALL_SOURCES})

# 根据系统定义
if(WIN32)
    target_compile_definitions(mssdev PRIVATE _WIN32)
elseif(LINUX)
    target_compile_definitions(mssdev PRIVATE LINUX)
endif()

# 头文件路径
include_directories(
    # basic libraries
    ${MY_LIB_PATH}/bcl2/inc
    ${MY_LIB_PATH}/parser2/inc
    # MSS application
    ${MY_APP_PATH}
    ${MY_APP_PATH}/core/inc
    ${MY_APP_PATH}/core/ssp/inc
)