Как связать статическую цель библиотеки с исполняемой целью в CMake> ver 3.0 - PullRequest
0 голосов
/ 08 мая 2019

Я создаю простой 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 с нуля:).

...