cmake простой подкаталог, не включая файлы

Я прочитал и попробовал почти все уроки / посты, страницы, фрагменты учебника / вики / SO, которые я смог найти, чтобы заставить работать этот CMAKE ….

У меня супер простая структура каталогов:

ROOT/
|- CMakeLists.txt
|- main.cpp
|- sub/
|-CMakeLists.txt
|-subx/
|-CMakeLists.txt
|-subx.h
|-subx.cpp
|-suby/
|-CMakeLists.txt
|-suby.h
|-suby.cpp

Main.cpp — это супер простая программа cpp:

//omitting all unnecessary code
int main() {
subx s;
s.defined_method();
s.another_defined_method(1);
return 0;
}

Для всех можно предположить, что определения subx и suby верны и работают просто отлично, потому что они работают, когда я компилирую вручную.

Когда я компилирую с помощью CMake, я получаю следующую ошибку:

"/path/to/cmake" --build /path/to/Debug --target CS220_Project -- -j 4
Linking CXX executable simple_project
Undefined symbols for architecture x86_64:
"subx::defined_method()", referenced from:
_main in main.cpp.o
"subx::another_defined_method(int)", referenced from:
_main in main.cpp.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
make[3]: *** [simple_project] Error 1
make[2]: *** [CMakeFiles/simple_project.dir/all] Error 2
make[1]: *** [CMakeFiles/simple_project.dir/rule] Error 2
make: *** [simple_project] Error 2

Корневой файл CMakeLists.txt выглядит так:

cmake_minimum_required(VERSION 2.8.4)
project(simple_project)

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")

set(SOURCE_FILES main.cpp)

add_subdirectory(sub)

add_executable(simple_project ${SOURCE_FILES})

Sub CMakeLists.txt файл выглядит так:

add_subdirectory(subx)
add_subdirectory(suby)

subx & Suby CMakeLists.txt выглядит файл: (они включают их соответствующие различия)

set(SUBX_SOURCES subx.cpp)

#Add any files in this directory
add_executable(SUBX ${SUBX_SOURCES})

Я пробовал такие вещи, как add_library, file (glob) и т. Д. Я не могу, потому что на всю жизнь я получаю файлы, которые находятся в любом подкаталоге для компиляции с программой main.cpp.

2

Решение

Зависит от того, что именно вы хотите, чтобы были подпроекты. Как я понимаю, subx а также suby это библиотеки, которые должны быть связаны с основным исполняемым файлом:

ROOT / CMakeLists.txt

cmake_minimum_required(VERSION 2.8.4)
project(simple_project)

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")

set(SOURCE_FILES main.cpp)

add_subdirectory(sub)

add_executable(simple_project ${SOURCE_FILES})
target_link_libraries(simple_project SUBX SUBY)

ROOT / subx / CMakeLists.txt

set(SUBX_SOURCES subx.cpp)

#Add any files in this directory
add_library(SUBX ${SUBX_SOURCES})

(то же самое для suby)

5

Другие решения


По вопросам рекламы [email protected]