Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

可能的头文件冲突问题 #40

Open
laper32 opened this issue Sep 18, 2022 · 5 comments
Open

可能的头文件冲突问题 #40

laper32 opened this issue Sep 18, 2022 · 5 comments

Comments

@laper32
Copy link

laper32 commented Sep 18, 2022

假设, 我有一个项目, 其同样需要使用fmt, spdlog, json等库, 且这些库的版本比当前所使用的版本更新.
那么我们需要做什么以规避可能会出现的头文件冲突问题?
有这个疑问是因为我看include/external/json里面是直接用了那个single header, 但假设我所在的项目也有这个single header, 那么是否会直接出现编译错误?

@zhllxt
Copy link
Owner

zhllxt commented Sep 19, 2022

我们需要做什么以规避可能会出现的头文件冲突问题?

答:
把asio2/3rd/目录下的fmt spdlog 删除,并使用你自己的版本的fmt spdlog即可。实际上在默认情况下,asio2框架只使用了asio2/3rd/asio这一个库,其它的默认情况下并没使用,而且你同样也可以用更高版本的asio来替换asio2/3rd/asio。
当开启ASIO2_ENABLE_LOG宏时,会使用asio2/3rd/spldlog库来记录一些调试日志。
当开启ASIO2_USE_SSL宏时,会使用asio2/3rd/openssl来实现ssl加密。
以上宏默认情况下并未开启。
当使用asio2的rpc相关的功能时,会使用到asio2/3rd/cereal库来做序列化,如果你不需要rpc,你直接删掉cereal都没有问题。
asio2/3rd/fmt库并未使用,只是为了日常工作便利,直接放在了3rd目录下,并在external/fmt.hpp文件中做了其它一些字符串的格式化器。
external/json.hpp这个single header,一是为日常工作便利,二是为了在rpc demo中演示如何使用第三方开源库的类型,如果你不主动包含这个single header,框架本身并不会去包含它使用它。
因此,只要你熟悉头文件包含和依赖的路径等,完全不会出现因头文件冲突导致的编译错误。

@laper32
Copy link
Author

laper32 commented Sep 19, 2022

的的确确, 如果熟悉就不会出现这种header冲突
但不管怎么说, 我们还是希望能够方便后来者.
这条作为留档, 为后来人做相对应的参考

@luodaoyi
Copy link

我们需要做什么以规避可能会出现的头文件冲突问题?

答: 把asio2/3rd/目录下的fmt spdlog 删除,并使用你自己的版本的fmt spdlog即可。实际上在默认情况下,asio2框架只使用了asio2/3rd/asio这一个库,其它的默认情况下并没使用,而且你同样也可以用更高版本的asio来替换asio2/3rd/asio。 当开启ASIO2_ENABLE_LOG宏时,会使用asio2/3rd/spldlog库来记录一些调试日志。 当开启ASIO2_USE_SSL宏时,会使用asio2/3rd/openssl来实现ssl加密。 以上宏默认情况下并未开启。 当使用asio2的rpc相关的功能时,会使用到asio2/3rd/cereal库来做序列化,如果你不需要rpc,你直接删掉cereal都没有问题。 asio2/3rd/fmt库并未使用,只是为了日常工作便利,直接放在了3rd目录下,并在external/fmt.hpp文件中做了其它一些字符串的格式化器。 external/json.hpp这个single header,一是为日常工作便利,二是为了在rpc demo中演示如何使用第三方开源库的类型,如果你不主动包含这个single header,框架本身并不会去包含它使用它。 因此,只要你熟悉头文件包含和依赖的路径等,完全不会出现因头文件冲突导致的编译错误。

非常赞 解决了我的疑惑和唯一的顾虑

@BunnySakura
Copy link

还有一个办法,比如我使用了spdlog库,为了避免冲突,先引入spdlog的头文件,再引入asio2,如下:

target_include_directories(${PROJECT_NAME} PRIVATE
        "${CMAKE_SOURCE_DIR}/lib/spdlog/include"
        "${CMAKE_SOURCE_DIR}/lib/asio2/include"
        "${CMAKE_SOURCE_DIR}/lib/asio2/3rd"
)

@heheda123123
Copy link
Contributor

还有一个办法,用xmake,里面的包已经处理好了,不存在冲突的问题

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

5 participants