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

2021-03-20 16:58:41 +08:00
 going2think

想到一个 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 的时候本地都会与远端冲突,想问下大家一般是解决这个问题的呢

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

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/763472

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX