我已经阅读并尝试了几乎每个教程/维基/ SO帖子,页面,我能找到的片段,以使这个CMAKE工作....
我有一个超级简单的目录结构:
ROOT/
|- CMakeLists.txt
|- main.cpp
|- sub/
|-CMakeLists.txt
|-subx/
|-CMakeLists.txt
|-subx.h
|-subx.cpp
|-suby/
|-CMakeLists.txt
|-suby.h
|-suby.cpp
Run Code Online (Sandbox Code Playgroud)
main.cpp是一个超级简单的cpp程序:
//omitting all unnecessary code
int main() {
subx s;
s.defined_method();
s.another_defined_method(1);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
你可以假设,为了每个人的缘故,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
Run Code Online (Sandbox Code Playgroud)
根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})
Run Code Online (Sandbox Code Playgroud)
Sub CMakeLists.txt文件看起来:
add_subdirectory(subx)
add_subdirectory(suby)
Run Code Online (Sandbox Code Playgroud)
subx&suby CMakeLists.txt文件看起来:(它们包括各自的区别)
set(SUBX_SOURCES subx.cpp)
#Add any files in this directory
add_executable(SUBX ${SUBX_SOURCES})
Run Code Online (Sandbox Code Playgroud)
我已经尝试过add_library,file(glob)等等.我不能,因为我的生活中使用main.cpp程序获取任何子目录中的文件.
取决于您希望子项目到底是什么.就我的理解,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)
Run Code Online (Sandbox Code Playgroud)
ROOT/SUBX /的CMakeLists.txt
set(SUBX_SOURCES subx.cpp)
#Add any files in this directory
add_library(SUBX ${SUBX_SOURCES})
Run Code Online (Sandbox Code Playgroud)
(dtto for suby)