lilott8
lilott8

Reputation: 1116

cmake simple sub-directory not including files

I have read and tried just about every tutorial/wiki/SO post, page, snippet I could find to get this CMAKE working....

I have a super simple directory structure:

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

The main.cpp is a super simple cpp program:

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

You can assume, for everyone's sake that the subx and suby definitions are correct and work just fine, because they do when I compile by hand.

When I compile by CMake I get the following error:

"/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

The root CMakeLists.txt file looks:

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 file looks:

add_subdirectory(subx)
add_subdirectory(suby)

subx & suby CMakeLists.txt file looks: (they include their respective distinction)

set(SUBX_SOURCES subx.cpp)

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

I've tried things like add_library, file (glob), etc. I cannot, for the life of me get files that are in any sub-directory to compile with the main.cpp program.

Upvotes: 2

Views: 2612

Answers (1)

Depends on what exactly you want the subprojects to be. The way I understand it, subx and suby are libraries, which should be linked to the main executable:

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})

(dtto for suby)

Upvotes: 5

Related Questions