#c #cmake
Вопрос:
Я хочу использовать cmake для создания своего проекта, моего CMakeLists.txt это очень просто:
cmake_minimum_required(VERSION 3.20)
project(YuvParallelProcess)
message("$(PROJECT_SOURCE_DIR)")
include_directories($(PROJECT_SOURCE_DIR)/inc)
link_directories($(PROJECT_SOURCE_DIR)/lib/libyuv)
add_executable(YuvParallelProcess $(PROJECT_SOURCE_DIR)/src/main.cpp)
target_link_libraries(YuvParallelProcess libyuv.a)
мои файлы проекта организованы следующим образом:
YuvParallelProcess
build
data
inc
lib
src
CMakeLists.txt
когда я запускаю cmake ..
в build
каталоге, оболочка печатает:
$(PROJECT_SOURCE_DIR)
-- Configuring done
CMake Error at CMakeLists.txt:10 (add_executable):
Cannot find source file:
$(PROJECT_SOURCE_DIR)/src/main.cpp
CMake Error at CMakeLists.txt:10 (add_executable):
No SOURCES given to target: YuvParallelProcess
Я не знаю, почему оболочка просто печатает $(PROJECT_SOURCE_DIR)
что-то другое, кроме значения PROJECT_SOURCE_DIR
Как я могу напечатать значение PROJECT_SOURCE_DIR
Кстати, я не могу понять, почему cmake не удалось скомпилировать мой проект
Комментарии:
1. В дополнение к приведенному ниже ответу: в большинстве этих случаев вам не нужно использовать абсолютные пути , и если вы это сделаете, это предпочтительнее использовать
CMAKE_CURRENT_SOURCE_DIR
, поскольку это относится к каталогу, содержащему текущийCMakeLists.txt
файл, независимо от того, есть лиproject()
команда или нет; в более сложных проектах вы можете оставить эту команду в подкаталоге. Кроме того, я рекомендую ограничить определения каталогов include/link там, где они необходимы, и использоватьtarget_include_directories
/target_link_directories
Ответ №1:
Cmake использовал фигурные скобки для получения значений переменных:
${PROJECT_SOURCE_DIR}
Я предлагаю сбрасывать сообщения, как показано ниже, чтобы не пропускать пустые сообщения.
message(PROJECT_SOURCE_DIR="${PROJECT_SOURCE_DIR}")
Cmake не удалось настроить ваш проект, потому что он не распознал переменные в круглых скобках и считался $(PROJECT_SOURCE_DIR)
строковым литералом как есть.
Ответ №2:
Вместо использования message
вы также можете использовать cmake_print_variables
для отображения переменных. в этом случае вы должны включить CMakePrintHelpers
include(CMakePrintHelpers)
cmake_print_variables(PROJECT_SOURCE_DIR)
Выход будет :
-- PROJECT_SOURCE_DIR="path/to/your/project"
С cmake_print_variables
помощью вы также можете отобразить несколько переменных, например:
cmake_print_variables(PROJECT_SOURCE_DIR ANOTHER_VARIABLE)
Выход будет :
-- PROJECT_SOURCE_DIR="path/to/your/project" ; ANOTHER_VARIABLE="other variable"