想到一个 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 的时候本地都会与远端冲突,想问下大家一般是解决这个问题的呢
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 呢,这个问题没考虑过? |
![]() | 2 going2think OP @GeruzoniAnsasu 感谢回复,用 VS 来 build 代码,现在做法比较 low,是直接把 submodule clone 进去,作为一个项目来编译,没用 CMake 来管理。。 |
![]() | 3 secondwtq 2021-03-20 17:33:34 +08:00 VS 能不能把里面那个 main.cpp 在工程里面无视掉 ... 貌似有个叫“Exclude from Project”的功能? 其实一般来讲直接引入 C++ 项目的都是库,不会编译出可执行文件,有的项目既会编译出库也会编译出可执行文件,这种项目一般已经使用了 CMake 之类的工具管理 build 过程 |
![]() | 4 ipwx 2021-03-20 17:34:44 +08:00 VS 是不是该把项目文件放进去。。。我记得 GitHub 的 VS 代码标准做法就是这个。有了项目文件不就可以配置多个编译目标了嘛。 |
![]() | 5 ipwx 2021-03-20 17:35:35 +08:00 (我是 CLion + CMake 用户,反正我自己是靠 CMake 设置了多个编译目标的 |
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,然后就能正常嵌套构建了 |
![]() | 7 Vinty 2021-03-20 19:35:48 +08:00 project a project b project test a project test b 这样 |
![]() | 8 going2think OP @GeruzoniAnsasu @ipwx @secondwtq @Vinty 感谢大家的帮助,我大概有个思路了,之前用的比较傻瓜,对项目的 vcxproj 文件没有仔细看过,应该是可以修改这个文件达到目的的,再次谢谢大家的帮助,我去试一试 |
![]() | 9 QBugHunter 2021-03-21 18:51:55 +08:00 自己手写 cmake 就不会遇到这种问题 |