Я создаю простой C ++ проект, чтобы ладить с CMake, и я не могу сделать это правильно, чтобы мое приложение успешно собирало (ссылки) (Примечание: меня интересует текущая версия CMake = версия 3.14).Это калькулятор командной строки, который организован так:
calculator/
CMakeLists.txt
application/
CMakeLists.txt
src/
...
libraries/
mymath/
CMakeLists.txt
include/
mymath/
mymath.h
src/
...
, поэтому для его сборки вручную я бы сделал:
1 - create static library: libmymath.a (yep, I'm on Linux)
2 - create object file: application.o
3 - link them together into: application (executable)
Я уже прочитал некоторые официальные документы с cmake.orgа также некоторые учебные пособия, но не смогли решить их с их помощью (кстати, многие из этих учебников / справок являются новыми, но для старой версии cmake, и если нет, то я не смог бы найти их, охватывающих этот случай или фактически любой случай от начала доконец (который не был продвинутым и требовал предварительных знаний о таких вещах, как расширение cmake с помощью ваших собственных функций и т. д.)).
Я также искал существующие файлы cmake, но нашел только недавно написанные старые: C (например, файлы cmake, управляемые сообществом googletest) ... Где мой привет cmake π !?
Мой текущий CMakeLists.txt записан следующим образом:
# top level CMakeLists.txt
cmake_minimum_required (VERSION 3.14.3)
project (calculator
VERSION 1.0.0
DESCRIPTION "nah"
LANGUAGES CXX)
add_subdirectory(application)
add_subdirectory (library/mymath)
target_link_libraries (calculator-app mymath)
# application/CMakeLists.txt
cmake_minimum_required (VERSION 3.14)
project (calculator-app
VERSION 1.0.0
DESCRIPTION "simple arythmetic command-line calculator"
LANGUAGES CXX)
add_executable (calculator-app)
target_sources (calculator-app PRIVATE
${PROJECT_SOURCE_DIR}/src/main.cpp
${PROJECT_SOURCE_DIR}/src/cli.cpp
${PROJECT_SOURCE_DIR}/src/expression.cpp)
# library/mymath/CMakeLists.txt
cmake_minimum_required (VERSION 3.14)
project (mymath
VERSION 1.0.0
DESCRIPTION "professional prod-ready heavly-opt math impl"
LANGUAGES CXX)
add_library (mymath STATIC)
target_sources(mymath PUBLIC
${PROJECT_SOURCE_DIR}/src/add.cpp
${PROJECT_SOURCE_DIR}/src/sub.cpp
${PROJECT_SOURCE_DIR}/src/mul.cpp
${PROJECT_SOURCE_DIR}/src/div.cpp)
target_include_directories(mymath INTERFACE
${PROJECT_SOURCE_DIR}/include)
На данный момент это работает нормально:
# being in calculator/
$ mkdir build
$ cd build
$ cmake ..
И тогда этотерпит неудачу:
$ make
С ошибкой:
Scanning dependencies of target mymath
[ 7%] Building CXX object library/mymath/CMakeFiles/mymath.dir/src/add.cpp.o
[ 15%] Building CXX object library/mymath/CMakeFiles/mymath.dir/src/sub.cpp.o
[ 23%] Building CXX object library/mymath/CMakeFiles/mymath.dir/src/mul.cpp.o
[ 30%] Building CXX object library/mymath/CMakeFiles/mymath.dir/src/div.cpp.o
[ 38%] Linking CXX static library libmymath.a
[ 38%] Built target mymath
Scanning dependencies of target calculator-app
[ 46%] Building CXX object application/CMakeFiles/calculator-app.dir/src/main.cpp.o
[ 53%] Building CXX object application/CMakeFiles/calculator-app.dir/src/cli.cpp.o
[ 61%] Building CXX object application/CMakeFiles/calculator-app.dir/src/expression.cpp.o
[ 69%] Building CXX object application/CMakeFiles/calculator-app.dir/__/library/mymath/src/add.cpp.o
[ 76%] Building CXX object application/CMakeFiles/calculator-app.dir/__/library/mymath/src/sub.cpp.o
[ 84%] Building CXX object application/CMakeFiles/calculator-app.dir/__/library/mymath/src/mul.cpp.o
[ 92%] Building CXX object application/CMakeFiles/calculator-app.dir/__/library/mymath/src/div.cpp.o
[100%] Linking CXX executable calculator-app
/usr/bin/ld: CMakeFiles/calculator-app.dir/src/expression.cpp.o: in function `OperatorsMapping::load()':
expression.cpp:(.text+0x151): undefined reference to `mymath::add(int, int)'
/usr/bin/ld: expression.cpp:(.text+0x18a): undefined reference to `mymath::sub(int, int)'
/usr/bin/ld: expression.cpp:(.text+0x1c3): undefined reference to `mymath::mul(int, int)'
/usr/bin/ld: expression.cpp:(.text+0x1fc): undefined reference to `mymath::div(int, int)'
/usr/bin/ld: expression.cpp:(.text+0x235): undefined reference to `mymath::div(int, int)'
collect2: error: ld returned 1 exit status
make[2]: *** [application/CMakeFiles/calculator-app.dir/build.make:175: application/calculator-app] Error 1
make[1]: *** [CMakeFiles/Makefile2:91: application/CMakeFiles/calculator-app.dir/all] Error 2
make: *** [Makefile:84: all] Error 2
Я попытался объединить файл CMakeLists.txt верхнего уровня с файлом из приложения / и переместить библиотеку / каталог в приложение /, но это не такt работал.
Я использую неправильные команды?Или, может быть, создание плохой структуры?Или, может быть, я тоже неправильно думаю о cmake?
Я бы с радостью узнал об этом и был бы признателен за хороший урок о том, как сделать обычные вещи с помощью современного cmake с нуля:).