【问题标题】:How to setup CMake to build code which contains path-includes like #include <libdir/lib>?如何设置 CMake 来构建包含 #include <libdir/lib> 等路径包含的代码?
【发布时间】:2019-09-24 10:39:34
【问题描述】:

我正在尝试将旧的 C/C++ sunstudio 项目迁移到 Visual Studio 2019。我需要在远程 linux 机器上构建目标,因此无法使用 Visual Studio 解决方案进行构建。在尝试使用旧的 sunstudio makefile 失败后,我决定使用 cmake 来构建项目。

问题在于代码引用包含相对路径,如下所示:

(tkamain.cxx):
#include <ukernel/inc/U.h>
#include <monitor/inc/monitor.h>

我不想接触代码,那么如何设置 CMake 以使用这些特定的包含语句正确构建这个项目?

项目结构如下所示。

tka
|-mod
||-monitor
||'-inc
||-feedutils
||'-inc
|'-ukernel
| '-inc
|-inc
||-foo.hxx
|'-bar.hxx
|-src
||-foo.cxx
||-bar.cxx
||-tkamain.cxx
|'-CMakeLists.txt (CMakeB)
'-CMakeLists.txt (CMakeA)

CMakeLists.txt 是我新创建的,可能还没有正确设置。

CMakeA 文件包含以下内容:

project(tka)
add_subdirectory(src)

CMakeB 文件包含以下内容:

include_directories(${PROJECT_SOURCE_DIR}/inc)
include_directories(${PROJECT_SOURCE_DIR}/mod)
add_executable(tkamain tkamain.cxx)

CMakeB 中的命令似乎不足以满足我的目的,我缺少什么?还是我需要更多 CMakeLists.txt 文件?

我得到的错误如下所示:

[ 50%] Building CXX object src/CMakeFiles/tkamain.dir/tkamain.cxx.o
/drive/new/home/mwe/.vs/tka/eb2f2a43-555a-3934-8996-0095b1bcc780/src/src/tkamain.cxx:11:27: error: ukernel/inc/U.h: No such file or directory
/drive/new/home/mwe/.vs/tka/eb2f2a43-555a-3934-8996-0095b1bcc780/src/src/tkamain.cxx:14:33: error: monitor/inc/monitor.h: No such file or directory

我曾尝试提供更具体的包含路径,例如这样,但这也无济于事:

include_directories(${PROJECT_SOURCE_DIR}/mod/ukernel/inc)
include_directories(${PROJECT_SOURCE_DIR}/mod/monitor/inc)

当我运行 make VERBOSE=1 时,我得到以下信息:

/usr/local/bin/cmake -S/drive/new/home/mwe/.vs/tka/eb2f2a43-555a-3934-8996-0095b1bcc780/src -B/drive/new/home/mwe/.vs/tka/eb2f2a43-555a-3934-8996-0095b1bcc780/out/build/Linux-Debug-test --check-build-system CMakeFiles/Makefile.cmake 0
/usr/local/bin/cmake -E cmake_progress_start /drive/new/home/mwe/.vs/tka/eb2f2a43-555a-3934-8996-0095b1bcc780/out/build/Linux-Debug-test/CMakeFiles /drive/new/home/mwe/.vs/tka/eb2f2a43-555a-3934-8996-0095b1bcc780/out/build/Linux-Debug-test/CMakeFiles/progress.marks
make -f CMakeFiles/Makefile2 all
make[1]: Entering directory `/drive/new/home/mwe/.vs/tka/eb2f2a43-555a-3934-8996-0095b1bcc780/out/build/Linux-Debug-test'
make -f src/CMakeFiles/tkamain.dir/build.make src/CMakeFiles/tkamain.dir/depend
make[2]: Entering directory `/drive/new/home/mwe/.vs/tka/eb2f2a43-555a-3934-8996-0095b1bcc780/out/build/Linux-Debug-test'
cd /drive/new/home/mwe/.vs/tka/eb2f2a43-555a-3934-8996-0095b1bcc780/out/build/Linux-Debug-test && /usr/local/bin/cmake -E cmake_depends "Unix Makefiles" /drive/new/home/mwe/.vs/tka/eb2f2a43-555a-3934-8996-0095b1bcc780/src /drive/new/home/mwe/.vs/tka/eb2f2a43-555a-3934-8996-0095b1bcc780/src/src /drive/new/home/mwe/.vs/tka/eb2f2a43-555a-3934-8996-0095b1bcc780/out/build/Linux-Debug-test /drive/new/home/mwe/.vs/tka/eb2f2a43-555a-3934-8996-0095b1bcc780/out/build/Linux-Debug-test/src /drive/new/home/mwe/.vs/tka/eb2f2a43-555a-3934-8996-0095b1bcc780/out/build/Linux-Debug-test/src/CMakeFiles/tkamain.dir/DependInfo.cmake --color=
make[2]: Leaving directory `/drive/new/home/mwe/.vs/tka/eb2f2a43-555a-3934-8996-0095b1bcc780/out/build/Linux-Debug-test'
make -f src/CMakeFiles/tkamain.dir/build.make src/CMakeFiles/tkamain.dir/build
make[2]: Entering directory `/drive/new/home/mwe/.vs/tka/eb2f2a43-555a-3934-8996-0095b1bcc780/out/build/Linux-Debug-test'
[ 50%] Building CXX object src/CMakeFiles/tkamain.dir/tkamain.cxx.o
cd /drive/new/home/mwe/.vs/tka/eb2f2a43-555a-3934-8996-0095b1bcc780/out/build/Linux-Debug-test/src && /usr/bin/c++   -I/inc  -g   -o CMakeFiles/tkamain.dir/tkamain.cxx.o -c /drive/new/home/mwe/.vs/tka/eb2f2a43-555a-3934-8996-0095b1bcc780/src/src/tkamain.cxx
/drive/new/home/mwe/.vs/tka/eb2f2a43-555a-3934-8996-0095b1bcc780/src/src/tkamain.cxx:11:27: error: ukernel/inc/U.h: No such file or directory
/drive/new/home/mwe/.vs/tka/eb2f2a43-555a-3934-8996-0095b1bcc780/src/src/tkamain.cxx:12:30: error: ukernel/inc/Ulib.h: No such file or directory
/drive/new/home/mwe/.vs/tka/eb2f2a43-555a-3934-8996-0095b1bcc780/src/src/tkamain.cxx:13:31: error: ukernel/inc/UExit.h: No such file or directory
/drive/new/home/mwe/.vs/tka/eb2f2a43-555a-3934-8996-0095b1bcc780/src/src/tkamain.cxx:14:33: error: monitor/inc/monitor.h: No such file or directory
/drive/new/home/mwe/.vs/tka/eb2f2a43-555a-3934-8996-0095b1bcc780/src/src/tkamain.cxx:31:26: error: tkacontrol.hxx: No such file or directory
/drive/new/home/mwe/.vs/tka/eb2f2a43-555a-3934-8996-0095b1bcc780/src/src/tkamain.cxx:24: error: expected ',' or ';' before 'U_OS'
/drive/new/home/mwe/.vs/tka/eb2f2a43-555a-3934-8996-0095b1bcc780/src/src/tkamain.cxx: In function 'int main(int, char**)':
/drive/new/home/mwe/.vs/tka/eb2f2a43-555a-3934-8996-0095b1bcc780/src/src/tkamain.cxx:37: error: 'UkInit' was not declared in this scope
/drive/new/home/mwe/.vs/tka/eb2f2a43-555a-3934-8996-0095b1bcc780/src/src/tkamain.cxx:39: error: 'TkaControl' was not declared in this scope
/drive/new/home/mwe/.vs/tka/eb2f2a43-555a-3934-8996-0095b1bcc780/src/src/tkamain.cxx:39: error: 'tkaControl' was not declared in this scope
/drive/new/home/mwe/.vs/tka/eb2f2a43-555a-3934-8996-0095b1bcc780/src/src/tkamain.cxx:39: error: expected type-specifier before 'TkaControl'
/drive/new/home/mwe/.vs/tka/eb2f2a43-555a-3934-8996-0095b1bcc780/src/src/tkamain.cxx:39: error: expected ';' before 'TkaControl'
/drive/new/home/mwe/.vs/tka/eb2f2a43-555a-3934-8996-0095b1bcc780/src/src/tkamain.cxx:41: error: 'UExitHandler' was not declared in this scope
/drive/new/home/mwe/.vs/tka/eb2f2a43-555a-3934-8996-0095b1bcc780/src/src/tkamain.cxx:41: error: expected ';' before 'exithandler'
/drive/new/home/mwe/.vs/tka/eb2f2a43-555a-3934-8996-0095b1bcc780/src/src/tkamain.cxx:43: error: 'Monitor2Startup' was not declared in this scope
/drive/new/home/mwe/.vs/tka/eb2f2a43-555a-3934-8996-0095b1bcc780/src/src/tkamain.cxx:45: error: 'evalarg_error' was not declared in this scope
/drive/new/home/mwe/.vs/tka/eb2f2a43-555a-3934-8996-0095b1bcc780/src/src/tkamain.cxx:46: error: 'UEXIT_STOP' was not declared in this scope
/drive/new/home/mwe/.vs/tka/eb2f2a43-555a-3934-8996-0095b1bcc780/src/src/tkamain.cxx:46: error: 'UExitMsg' was not declared in this scope
/drive/new/home/mwe/.vs/tka/eb2f2a43-555a-3934-8996-0095b1bcc780/src/src/tkamain.cxx:49: error: 'UkMain' was not declared in this scope
/drive/new/home/mwe/.vs/tka/eb2f2a43-555a-3934-8996-0095b1bcc780/src/src/tkamain.cxx:50: error: 'Monitor2Exit' was not declared in this scope
/drive/new/home/mwe/.vs/tka/eb2f2a43-555a-3934-8996-0095b1bcc780/src/src/tkamain.cxx:59: error: 'UEXIT_STOP' was not declared in this scope
/drive/new/home/mwe/.vs/tka/eb2f2a43-555a-3934-8996-0095b1bcc780/src/src/tkamain.cxx:59: error: 'UExitMsg' was not declared in this scope
make[2]: *** [src/CMakeFiles/tkamain.dir/tkamain.cxx.o] Error 1
make[2]: Leaving directory `/drive/new/home/mwe/.vs/tka/eb2f2a43-555a-3934-8996-0095b1bcc780/out/build/Linux-Debug-test'
make[1]: *** [src/CMakeFiles/tkamain.dir/all] Error 2
make[1]: Leaving directory `/drive/new/home/mwe/.vs/tka/eb2f2a43-555a-3934-8996-0095b1bcc780/out/build/Linux-Debug-test'
make: *** [all] Error 2

【问题讨论】:

  • 运行详细构建 (make VERBOSE=1) 并查看构建时使用的命令和它们的选项和标志。确保包含路径选项(-I,大写 i)正确。
  • @wegwerf:你试过 TARGET_INCLUDE_DIRECTORIES(tkamain ${PROJECT_SOURCE_DIR}/mod) 吗?
  • @Gojita 是的,在 add_executable() 之前和之后。不过,我确实添加了 PUBLIC 作为选项。
  • @wegwerf:好的,但我在您发送的树中没有看到这些文件。您是否已从树输出中删除它们?我检查过文件在那里吗?
  • @wegwerf:这不是他/她的意思。但是“make VERBOSE=1”的输出(不是cmake的输出)

标签: c++ visual-studio makefile cmake


【解决方案1】:

有了这个:

# CMakeA
cmake_minimum_required(VERSION 3.8)
project(tka)
add_subdirectory(src)

# CMakeB
add_executable(tkamain tkamain.cxx)
target_include_directories(tkamain PUBLIC ${PROJECT_SOURCE_DIR}/inc)
target_include_directories(tkamain PUBLIC ${PROJECT_SOURCE_DIR}/mod)

当我运行“cmake VERBOSE=1”时,我得到以下输出:

[ 50%] Building CXX object src/CMakeFiles/tkamain.dir/tkamain.cxx.o
cd /home/lma/tmp/stackoverflow/tka/src && /usr/bin/c++   -I/home/lma/tmp/stackoverflow/tka/inc -I/home/lma/tmp/stackoverflow/tka/mod   -o CMakeFiles/tkamain.dir/tkamain.cxx.o -c /home/lma/tmp/stackoverflow/tka/src/tkamain.cxx
/home/lma/tmp/stackoverflow/tka/src/tkamain.cxx:1:10: fatal error: ukernel/inc/U.h: No such file or directory
 #include <ukernel/inc/U.h>
          ^~~~~~~~~~~~~~~~~
compilation terminated.

如您所见,有两个指令 -I/home/lma/tmp/stackoverflow/tka/inc -I/home/lma/tmp/stackoverflow/tka/mod

我建议你从我发送的 2 个小 CMakeLists.txt 开始 并清理你所有的 cmake 中间文件。

【讨论】:

  • 感谢您的帮助。看起来问题不在于 CMake 配置,而在于 Visual Studio 和项目的设置方式。我将编辑帖子进行解释。但问题似乎已经解决了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-04-23
  • 2015-01-27
  • 2023-03-29
  • 1970-01-01
  • 2014-03-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多