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

如何更好的在 c++各个 project 共享代码

  •  
  •   v2byy · 2018-09-19 11:37:11 +08:00 · 2539 次点击
    这是一个创建于 2017 天前的主题,其中的信息可能已经有所发展或是发生改变。

    使用 visual studio 做 c++开发。

    如:

    Project A: |_a.h |_a.cpp

    Project B: |_b.h |_b.cpp |_a.cpp //在 vc directory 将 Project A 目录 include 进来,然后将 a.cpp add 进来

    想过用 Shared items project,但是不太适合我的一种场景,比如还有一个 Project C,然后 Project B 是一个 dll,Project C 依赖于 B,则 B,C 不能同时 reference A,会造成符号已定义的链接问题。

    有没有更好的方法?

    第 1 条附言  ·  2018-09-19 13:47:28 +08:00
    好吧,可能我没描述清楚,请看下 stackexchagne 中的一个问题:

    https://softwareengineering.stackexchange.com/questions/230690/shared-source-file-between-two-parts-of-project


    我想要问的是一样的问题。
    9 条回复    2018-09-19 17:59:02 +08:00
    wutiantong
        1
    wutiantong  
       2018-09-19 11:54:47 +08:00
    static/shared library, compile & link 这些基本概念搞清楚先?
    v2byy
        2
    v2byy  
    OP
       2018-09-19 12:03:26 +08:00 via iPhone
    @wutiantong 有什么问题,请指教一下
    GeruzoniAnsasu
        3
    GeruzoniAnsasu  
       2018-09-19 12:41:52 +08:00
    把重合的代码拆出来作为单独的子项目,不要局限于现有的文件结构,代码结构产生了麻烦就应该主动拆分文件


    手上项目是一个 python 套 c 套 c 套 c++套 c 套 c (指 git submodule 层级)的项目,也没产生什么依赖问题

    然后你说的 c 依赖 b 导致 a 重复引用的问题照理来讲应该不可能存在,a 编译出的代码被 b 引用也被 c 引用并不会产生什么问题啊,这不是很正常吗
    wutiantong
        4
    wutiantong  
       2018-09-19 13:03:18 +08:00
    @v2byy 问题就是你没有把你的问题表达清楚。
    Abercrombie
        5
    Abercrombie  
       2018-09-19 13:23:49 +08:00
    确实没有描述清楚
    如果就按照你的描述 文件这么少的 toy project 根本不需要用到依赖( dependence )直接项目 B 包含四个文件编译就行了
    如果是大项目 把需要共享的部分高度抽象化做成工具类 或者打包成.so 和头文件
    wutiantong
        6
    wutiantong  
       2018-09-19 15:39:54 +08:00
    basically, you need to learn this: https://en.wikipedia.org/wiki/Make_(software)
    v2byy
        7
    v2byy  
    OP
       2018-09-19 16:16:44 +08:00
    @wutiantong 恩,编写 makefile 其实跟我现在描述的方式无本质差别。makefile 也是相当于将源文件 include 进来,跟直接使用 visual studio 包含路径是一样的。
    gnaggnoyil
        8
    gnaggnoyil  
       2018-09-19 17:39:49 +08:00
    自己手动改动 sln 和 vcproj.这俩里面都是 XML 的内容,语义很清晰.
    smol
        9
    smol  
       2018-09-19 17:59:02 +08:00   ❤️ 1
    是这个意思么:你 B 通过源码包含了 A,C 也通过源码包含了 A,现在 C 链接到 B,结果提示 A 的符号冲突。
    就事论事的办法:B 既然封装成库,就要详细规划 B 的接口,不要把 A 的东西暴露出来。这样 C 链接到 B 是就不会提示冲突。
    更好的办法是:详细梳理你的各模块依赖,将接口进行合理设计,而不是这种胡乱包含,包的管理其实与语言无关,更多是一种逻辑能力。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   5948 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 683ms · UTC 02:07 · PVG 10:07 · LAX 19:07 · JFK 22:07
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.