【发布时间】: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