Как настроить CMake для сборки кода, который содержит пути-включения, такие как #include? - PullRequest
0 голосов
/ 24 сентября 2019

Я пытаюсь перенести старый проект C / C ++ sunstudio в Visual Studio 2019. Мне нужно создавать цели на удаленной машине Linux, поэтому я не могу использовать решение Visual Studio для сборки.После некоторых неудачных попыток использовать старые make-файлы sunstudio я решил использовать cmake для создания проекта.

Проблема в том, что ссылки на код включают в себя относительные пути, например:

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

Я не хочу касаться кода, так как я могу настроить CMake для правильной сборки этого проекта с этими конкретными операторами include?

Структура проекта выглядит следующим образом.

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 содержитthis:

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

1 Ответ

0 голосов
/ 24 сентября 2019

С этим:

# 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

Я предлагаю вам начать с двух маленьких CMakeLists.txt, которые я отправил, и очистить также всех васcmake промежуточный файл.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...