-2

我有以下任务。有一个java包需要移植到c++17。正在使用转译工具来帮助完成任务并避免手动重写每个文件。目前,对于所有 java 类/接口,正在创建相应的 c++ 类。

我看到的第一个问题是原始的 java 包很大,它有 180 多个文件夹。这些都在新的 c++ 代码库中复制。我们想使用 Cmake 作为构建工具,但我们看到的第一个问题是,我们不能简单地将项目拆分为多个子目录,并简单地在每个子目录中构建单独的共享库,因为它们相互依赖,并且我真的很害怕以循环依赖告终。
我知道这里有很多要问的问题,但是,关于如何使用 cmake 将这种端口形式 java 组织到 c++ 的最佳实践(如果存在的话)是什么。我们希望保留文件夹结构,因为它是合乎逻辑的。到目前为止,我看到的唯一解决方案是建立一个依赖于一切的巨大目标。高度赞赏这种结构的任何评论和想法或示例。

4

1 回答 1

1

您可以构建构建,以便最终结果确实是一个包含所有内容的巨大目标,但是进入该构建的子组件以分段方式指定,这将使设置更接近其源。

作为一个基本示例,我设置了一个测试项目

基础 CMakeLists.txt:

cmake_minimum_required(VERSION 3.14)
project(cmake_test)

add_library(megalib SHARED dummy.cpp)
add_subdirectory(a)
add_subdirectory(b)

一个/CMakeLists.txt:

target_include_directories(megalib PUBLIC ${CMAKE_CURRENT_SOURCE_DIR})
target_sources(megalib PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/a.cpp)

b/CMakeLists.txt:

target_include_directories(megalib PUBLIC ${CMAKE_CURRENT_SOURCE_DIR})
target_sources(megalib PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/b.cpp)

以及生成的编译日志(使用 Ninja 生成器):

[1/4] /usr/bin/c++  -Dmegalib_EXPORTS -I/tmp/cmake-test/a -I/tmp/cmake-test/b -fPIC -MD -MT CMakeFiles/megalib.dir/dummy.cpp.o -MF CMakeFiles/megalib.dir/dummy.cpp.o.d -o CMakeFiles/megalib.dir/dummy.cpp.o -c /tmp/cmake-test/dummy.cpp
[2/4] /usr/bin/c++  -Dmegalib_EXPORTS -I/tmp/cmake-test/a -I/tmp/cmake-test/b -fPIC -MD -MT CMakeFiles/megalib.dir/a/a.cpp.o -MF CMakeFiles/megalib.dir/a/a.cpp.o.d -o CMakeFiles/megalib.dir/a/a.cpp.o -c /tmp/cmake-test/a/a.cpp
[3/4] /usr/bin/c++  -Dmegalib_EXPORTS -I/tmp/cmake-test/a -I/tmp/cmake-test/b -fPIC -MD -MT CMakeFiles/megalib.dir/b/b.cpp.o -MF CMakeFiles/megalib.dir/b/b.cpp.o.d -o CMakeFiles/megalib.dir/b/b.cpp.o -c /tmp/cmake-test/b/b.cpp
[4/4] : && /usr/bin/c++ -fPIC    -shared -Wl,-soname,libmegalib.so -o libmegalib.so CMakeFiles/megalib.dir/dummy.cpp.o CMakeFiles/megalib.dir/a/a.cpp.o CMakeFiles/megalib.dir/b/b.cpp.o   && :

然后设置一些宏以减少子目录之间的重复量可能很有用。(特别是为了减少必须为添加到子目录中的每个源文件指定绝对文件路径的负担。)

于 2019-07-24T21:43:37.333 回答