V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
going2think
V2EX  ›  C++

C++ 代码作为 submodule 时,如何避免包含的 main 函数与主包中的 main 冲突

  •  
  •   going2think · 2021-03-20 16:58:41 +08:00 · 1843 次点击
    这是一个创建于 1105 天前的主题,其中的信息可能已经有所发展或是发生改变。

    想到一个 C++的问题,请大家帮忙看看,提前谢谢了。 现在有仓库 repo_A:

    -repo_A
    |-- A.h
    |-- A.cpp
    |-- main.cpp
    

    main.cpp 中定义了 main 函数,用于自己代码的测试。

    现在把 repo_A 作为 submodule 包含在一个更大的仓库 repo_B 中,而 repo_B 也有自己的 main 函数,结构大致如下:

    -repo_B
    |--main.cpp
    |-- repo_A
    |--|-- A.h
    |--|-- A.cpp
    |--|-- main.cpp
    |--repo_C
    ...
    

    那有个问题,在编译时(例如在 VS 中一键编译),如何避免两个 main 函数的冲突呢,如果注释掉 repo_A 中的 main 函数,每次 pull 的时候本地都会与远端冲突,想问下大家一般是解决这个问题的呢

    9 条回复    2021-03-21 18:51:55 +08:00
    GeruzoniAnsasu
        1
    GeruzoniAnsasu  
       2021-03-20 17:06:34 +08:00
    构建系统是啥?

    你不会把目录和子目录下所有.cpp 文件全抓到一起作为 source 吧?

    典型 cmake:

    projectA/CMakeLists.txt:
    add_subdirectory(src)

    projectA/src/CMakeLists.txt:
    file(GLOB_RECURSE *.cpp)

    target_include_directorie(projectA `submodule`/include)


    这种结构,projectA 和 submodule 的 source 又不交叉
    抛开 submodule,unit test 也有 main 呢,这个问题没考虑过?
    going2think
        2
    going2think  
    OP
       2021-03-20 17:24:19 +08:00
    @GeruzoniAnsasu 感谢回复,用 VS 来 build 代码,现在做法比较 low,是直接把 submodule clone 进去,作为一个项目来编译,没用 CMake 来管理。。
    secondwtq
        3
    secondwtq  
       2021-03-20 17:33:34 +08:00
    VS 能不能把里面那个 main.cpp 在工程里面无视掉 ... 貌似有个叫“Exclude from Project”的功能?
    其实一般来讲直接引入 C++ 项目的都是库,不会编译出可执行文件,有的项目既会编译出库也会编译出可执行文件,这种项目一般已经使用了 CMake 之类的工具管理 build 过程
    ipwx
        4
    ipwx  
       2021-03-20 17:34:44 +08:00
    VS 是不是该把项目文件放进去。。。我记得 GitHub 的 VS 代码标准做法就是这个。有了项目文件不就可以配置多个编译目标了嘛。
    ipwx
        5
    ipwx  
       2021-03-20 17:35:35 +08:00
    (我是 CLion + CMake 用户,反正我自己是靠 CMake 设置了多个编译目标的
    GeruzoniAnsasu
        6
    GeruzoniAnsasu  
       2021-03-20 17:56:40 +08:00
    @going2think vs 一样可以嵌套 project 啊

    vs 最简单粗暴了项目包含的源文件全列在.vcxproj 里,没有就不编译。
    一个 sln 能套 N 个 vcxproj,vcxproj 可以相互指定依赖,先构建被依赖的 project,然后构建上层的。
    用 vs 的话你的项目目录应该是

    project/:
    A.sln A.vcxproj submodules/ src/

    project/submodules/:
    B/

    project/submodules/B:
    B.vcxproj src/


    在 A.sln 里加入 A.vcxproj 和 B.vcxproj,A 依赖 B,然后就能正常嵌套构建了
    Vinty
        7
    Vinty  
       2021-03-20 19:35:48 +08:00
    project a
    project b
    project test a
    project test b
    这样
    going2think
        8
    going2think  
    OP
       2021-03-20 20:56:11 +08:00
    @GeruzoniAnsasu @ipwx @secondwtq @Vinty 感谢大家的帮助,我大概有个思路了,之前用的比较傻瓜,对项目的 vcxproj 文件没有仔细看过,应该是可以修改这个文件达到目的的,再次谢谢大家的帮助,我去试一试
    QBugHunter
        9
    QBugHunter  
       2021-03-21 18:51:55 +08:00
    自己手写 cmake 就不会遇到这种问题
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   2876 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 11:24 · PVG 19:24 · LAX 04:24 · JFK 07:24
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.